Having dismissed the visitors for 295 on a pitch that appears to be getting easier to bat on, England reached 219 for six at the close of day two.
Liam Plunkett (4) and Matt Prior (2) will look to reach India's total on Saturday should the predicted poor weather hold off, while the visitors will be desperate to take a lead into their second innings.
Bhuvneshwar Kumar was the pick of the Indian bowlers, getting rid of captain Alastair Cook and Sam Robson before lunch and Ian Bell after the break.
The hosts also lost Joe Root before Ballance and Moeen, two of England's success stories in what has been a tough period after series defeats by Australia and Sri Lanka, combined to good effect.
They put on 98 for the fifth wicket, having come together with their side in trouble at 113 for four.
While others in England's order struggle, Zimbabwe-born Ballance continues to prosper at number three, scoring two centuries and two half-centuries in his last five turns at the crease.
He hit 15 boundaries in total, reaching three figures off 186 balls when he flicked Stuart Binny through the on side.
After lofting the first ball he faced to the fence, Moeen showed commendable patience in supporting Ballance before being trapped lbw by part-time spinner Murali Vijay for 32.
Ballance fell shortly after the new ball was taken, well caught down the leg side by Mahendra Singh Dhoni to become Kumar's fourth wicket.
Question marks remain over the form of Cook, however, who has not passed three figures in over a year and has now scored 93 runs in six test innings against Sri Lanka and India this season after this latest failure.
He looked comfortable at the crease before nibbling at a ball from the accurate Kumar that was caught by Dhoni behind the stumps, a combination of poor footwork and lack of conviction contributing to his downfall.
Fellow opener Sam Robson's determination to fling the bat at a ball from Kumar saw him off for 17, while Ian Bell was taken by surprise by a delivery that jagged in and caught him on the glove, catches being taken by Dhoni and Jadeja respectively.
Joe Root was starting to look comfortable before being given out lbw to spinner Ravindra Jadeja despite him getting an inside edge.
Earlier India's first innings lasted only ten balls of the morning session before Ben Stokes had Shami caught by Cook, his 100th test catch, with five runs added to the overnight score.
The quick breakthrough was scant consolation for the hosts, who had India at 145 for seven just after tea on Thursday before Ajinkya Rahane (103) combined with the lower order to ensure their bowlers had a total to defend.
The first match of the five-test series at Trent Bridge was drawn.
- Sports & Recreation
- Alastair Cook
- Bhuvneshwar Kumar
- Mahendra Singh Dhoni
- Sam Robson
- Joe Root