Goals from Karim El Ahmadi and Leandro Bacuna cancelled out efforts from Yaya Toure and Edin Dzeko with Andreas Weimann popping up with the winner for Paul Lambert's men.
The home side found themselves outplayed for long periods of the game, but somehow managed to take all three points to leave City still looking for their first win away from home this season.
City started brightly and created their first chance of the game after just three minutes when Dzeko dummied Aleksandar Kolarov's cross inside the box for James Milner and the former Villa man flashed his shot just wide of the target.
The visitors were dominating possession in the early stages and Samir Nasri created a chance for Dzeko on eight minutes when he slipped in the striker inside the box and his shot brought a smart save from Brad Guzan.
Villa's only effort of note in the first half was a free-kick from El Ahmadi which sailed well over the crossbar as Lambert's men struggled to get hold of the ball.
Ciaran Clark had a lucky escape on 39 minutes when he hacked Kolarov's dangerous cross just over his own crossbar and from the resulting corner City went close to breaking the deadlock when Dzeko headed down into the path of Toure and he saw his shot knocked off the line through a combination of Clark and Libor Kozak.
Toure was inches away from scoring a minute before the break when his deflected shot from the edge of the box flew just wide of the far post with Guzan well beaten in goal.
However, from the resulting corner City finally made the breakthrough when Villa failed to clear Nasri's delivery and Toure was on hand to volley the ball through the legs of Guzan.
Villa stunned City six minutes into the second half when they equalised with their first attack after the break with a controversial goal from El Ahmadi.
Bacuna slipped in El Ahmadi inside the box with the midfielder appearing to be marginally offside, but there was no offside flag raised and he drilled his shot low into the corner past Joe Hart.
The goal stung City into action and they restored their lead five minutes later when Dzeko rose highest to meet Nasri's in-swinging corner.
Villa dragged themselves back into the game on 73 minutes when Weimann won a free kick 25 yards from goal after a foul by Matija Nastasic and Bacuna stepped up to curl a superb free-kick over the wall and past a stranded Hart.
Two minutes later Villa turned the game on its head with a real route one effort from Weimann after some comical defending from City.
Guzan pumped a long goalkick straight down the middle and Vincent Kompany and Nastasic both left the ball to each other allowing Weimann to go clear on goal and he managed to beat the onrushing Hart to the ball to poke it past the keeper and into the empty net.
City threw everything at Villa in the closing stages, but Villa held to claim a memorable win and their first home victory in the Premier League this season.