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.
City were under immense pressure to turn the game around, but Guardiola's inspired substitutions paid dividends as Raheem Sterling set up Gundogan at the far post for a header in the 71st minute, a goal which provided a major boost for the Etihad faithful.
Oleksandr Zinchenko, who came on at half time for the departing Fernandinho, set up Rodri for City's equaliser just two minutes later, with the Spaniard calmly placed a strike into the bottom-left corner from the edge of the area.
City then completed a dramatic comeback in the 81st minute when Kevin De Bruyne pounced on a loose ball before fizzing a low, curling cross towards the back post where Gundogan was positioned perfectly to tap in from close range.
Liverpool scored twice in the closing stages of their game against Wolves, but their result was not enough to leapfrog City, who held on for a memorable victory to retain the Premier League title.