Paul Lambert's men were forced to come from behind twice but took the lead in extra-time and subsequently held on to secure their place in the fourth round of the League Cup
Villa had to come from behind twice in the game before Charles N'Zogbia and Gabriel Agbonlahor secured the win in extra time.
City had taken the lead in the first half through Mario Balotelli, but were pegged back when Gareth Barry put through his own goal after good work from Andreas Weimann.
A 20-yard free kick from Aleksandar Kolarov put the home side ahead again five minutes later, but Agbonlahor equalised to take the game into extra time and then scored again following an N'Zogbia strike to put the result beyond doubt.
Roberto Mancini named ten new faces from the side held by Arsenal, with only Joleon Lescott retaining his place and only after Jack Rodwell picked up an injury in the warm-up.
Carlos Tevez and Balotelli both started with Denis Suarez and Adbul Razak two youngsters given the chance to shine for the first team.
Meanwhile, Villa also made changes but nowhere near as many, Shay Given replacing Brad Guzan in goal and Agbonlahor recalled to lead the line for the visitors.
The terrible Manchester weather made conditions tough for both sides in the opening half and chances were at a real premium, with the majority of the game being played between the two penalty areas.
In the tenth minute Villa had the best chance of the opening exchanges as Agbonlahor decided to test Costel Pantilimon with a long range skidding effort from 25 yards.
The Romanian pushed the ball away but only as far as Andreas Weimann, who found the unmarked Christian Benteke only to see the Belgian fail to convert.
City made Villa pay for that miss in the 27th minute, though they were given plenty of help by some woeful marking.
Tevez sprayed a lovely cross-field pass to Milner, he cut inside onto his left foot before finding Balotelli unmarked inside the penalty area to smash the ball past City old-boy Shay Given.
The second half began just as the first had done, with neither side dominating the game and the general play lacking the necessary zip. However, just before the hour, Villa got themselves an equaliser that sparked the game into life.
Weimann was released down the right hand side and delivered a dangerous low cross into the six-yard area, there was no Villa player nearby but Pantilimon pushed the cross into Barry and the ball looped over the line.
Ironically, that brought City back to life and within four minutes they were ahead again as Kolarov fired in one of his trademark free kicks.
Balotelli made an excellent run down the right channel but was brought down just outside the area, Kolarov won the rights to take the set piece and it proved the right decision as he fired past Given from 20 yards.
Villa were not finished though, and in the 70th minute they were level again, this time through Agbonlahor. A neat build up from the visitors saw the ball break free and the striker raced onto it and calmly fired past Pantilimon from the edge of the penalty area.
Neither side were able to break the deadlock inside the 90 minutes so the game entered extra time and five minutes in Villa took the lead for the first time in the game.
Pantilimon should have done better with a low Agbonlahor shot, but he could only parry the ball into open space inside his penalty area and N'Zogbia was first to the ball to roll it home.
In the second half of extra time Villa confirmed their place in the fourth round as Agbonlahor scored his second goal of the game, the ball looping up off Pantilimon and into the bottom corner of the net.