The Croatian struck after 18 minutes at the Juventus Stadium as the home side not only secured their place in the last 16 but put themselves in pole position to claim top spot.
The Italians were good value for their victory, with reported City target Paul Pogba outstanding, but the injury-hit visitors had a host of chances in an entertaining contest.
Substitute Raheem Sterling had one of the best of them as he shot wide late on while Fernando had a header turned onto the post and Fernandinho blasted over when well placed.
City again looked vulnerable in defence without captain Vincent Kompany and are still missing the craft of David Silva, while Sergio Aguero is not fully match-fit. They will also be concerned to have lost Joe Hart to injury late on.
City had shown signs of promise from early on as Fernandinho drove wide after Kevin De Bruyne’s dangerous low ball was poorly dealt with by the Juve defence.
Fernandinho had an even better chance as he raced onto a loose ball in the box after Yaya Toure had tangled with Giorgio Cheillini but he blasted over from 10 yards.
But although City looked composed in possession, Juventus were even stronger and certainly more clinical in the final third.
Pogba could not be contained and a brilliant backheel to release Mandzukic caught City completely unaware, but the visitors were rescued by an offside flag.
There was no escape after 18 minutes as Alex Sandro, also impressive on the right, curled in a hanging cross and Mandzukic shook off the attention of Nicolas Otamendi to volley past Hart. City felt Otamendi was fouled but referee Felix Brych ruled Mandzukic’s challenge was fair.
Mandzukic was denied a second by a brilliant one-handed save from Hart as he met Paulo Dybala’s nod down with a firm shot.
Toure tried to match Pogba’s dynamism and clipped a shot over before charging forward to fire wide.
But Juve continued to carry a greater threat, and it needed a combination of Gael Clichy and Hart to force Dybala wide and to shoot into the side-netting.
City were almost gifted an equaliser on the stroke of half-time as Aguero seized on a Claudio Marchisio backpass, but veteran goalkeeper Gianluigi Buffon was alert to the danger.
Buffon saved Juve again at a corner early in the second half as he palmed a Fernando header onto the post and grabbed the loose ball at the feet of Toure.
Juve responded with a slick attack and substitute Alvaro Morata broke clear to lob the advancing Hart. The ball appeared to be bouncing narrowly wide when Dybala slid in and clipped the post.
City breathed again as Morata ran through the defence only to be denied by the outstretched boot of Hart, but that appeared to come at a cost for the England goalkeeper. Moments later, Hart left the field holding the top of his leg and was replaced by Willy Caballero.
Another of City’s substitutes, Sterling, spurned a fine opportunity as he slid in to meet a cross and failed to make clean connection, missing the target.
City fought to the end and Toure went close with a long-range drive but it was not to be their night.
Buffon, Barzagli, Bonucci, Chiellini, Lichtsteiner, Sturaro, Marchisio, Pogba, Alex Sandro (Evra, 78), Mandzukic (Morata, 55), Dybala (Cuadrado, 82).
Hart (Caballero, 81), Sagna, Demichelis, Otamendi, Clichy, Fernando, Fernandinho (Delph, 60), Jesus Navas, Toure, De Bruyne, Aguero (Sterling, 69).
Felix Brych (Germany)