Goals from Yaya Toure and Edin Dzeko were not enough as last season's runner-up was handed a reality check following last weekend's dominant victory in the Manchester derby.
Fresh from netting nine goals in a week against Manchester United and Wigan Athletic, City was in dominant mood in the first half on Saturday but had to wait for Yaya Toure's sixth strike in eight games to put the club ahead in its final minute.
Having failed to muster a shot on target before the break, Karim El Ahmadi produced a clinical finish to haul Villa level amid strong suspicions of offside in the 51st minute.
Edin Dzeko glanced in from Samir Nasri's corner to restore City's advantage five minutes later but Bacuna lashed home a stunning free kick for his first Villa goal after Matija Nastasic fouled Weimann.
Nastasic and Vincent Kompany were caught napping as Weimann stole in to beat the on-rushing Joe Hart with a 75th-minute winner.
In the injury absence of forward duo Christian Benteke (hip) and Gabriel Agbonlahor (ankle), Villa manager Paul Lambert handed a first start to last weekend’s match-winner at Norwich City, Libor Kozak, and reverted to a 5-3-2 formation.
Sergio Aguero picked up a knock after firing a derby day brace last weekend, meaning Dzeko partnered Alvaro Negredo in attack. Elsewhere, Jesus Navas dropped to the bench to accommodate Villa old boy James Milner in the City midfield.
Milner had the game's first opening in the third minute, lashing wide left-footed after Dzeko dummied a low cross from Aleksandar Kolarov.
Continuing the impressive form he showcased six days ago, Samir Nasri was at the hub of an impressive start by City.
First, a cute through ball allowed Dzeko to slide in on the angle and draw a save from Brad Guzan before the France international fired narrowly wide from the edge of the box having led a swift counterattack.
Dzeko failed to get on top of a good headed chance from a 14th-minute corner and City proceeded to dominate the opening half hour without again testing Guzan.
City's pressure continued largely unchecked but the team was failing to consistently find a quality final ball until the half’s outstanding player intervened at its conclusion.
After watching Ciaran Clark clear off the line and Nathan Baker deflect his fierce drive wide, Toure crowned a typically dominant display from midfield by steering Nasri’s corner through Guzan’s legs.
Negredo and Kolarov threatened as City began the second period at a furious place but Manuel Pellegrini's team would soon rue its profligacy.
El Ahmadi collected Bacuna's wonderfully weighted pass to fire home low across Hart as the linesman's flag stayed down.
But as it did from its ninth corner, City netted from its 10th to ensure parity lasted only six minutes.
Dzeko made the most of a static Villa defense to glance Nasri's in-swinging delivery past Guzan.
Ring wing crosses from Zabaleta and Navas – introduced in place of Nasri – invited further punishment that did not arrive from Dzeko but just as Villa looked to be entering survival mode the home side stunned City again.
Villa Park was in raptures following Bacuna's heroics and the noise levels were further ramped up as Weimann lifted Villa up to ninth in the table - only a point behind City in fifth.