The Citizens were trailing 2-0 heading into the final 15 minutes after Matty Cash and former Liverpool man Philippe Coutinho scored either side of half time, but a brace from substitute Ilkay Gundogan and a strike from Rodri helped the hosts turn the game on its head within a five-minute period.
Pep Guardiola's side, who have now won four Premier League titles in the last five seasons, finish the campaign at the top of the table with 93 points, just one clear of rivals Liverpool, who came from behind themselves to beat Wolverhampton Wanderers 3-1 at Anfield.
City dominated proceedings in the opening exchanges but it was Villa who broke the deadlock in the 37th minute, when Lucas Digne set up fellow full-back Cash for a header at the back post.
The hosts began the second half brightly and should have equalised five minutes after the break when Gabriel Jesus poked over the crossbar from point-blank range.
Ollie Watkins then dragged a shot narrowly wide just moments later after running clean through on goal; the Villa forward was initially flagged offside but replays show that he was in his own half when the ball was played over the top of City's backline.
That miss, however, was quickly forgotten as the visitors scored a second in the 69th minute when Watkins flicked on a header towards Coutinho who cut inside on the edge of the penalty are before placing a low-driven strike into the bottom-left corner.
More to follow.