N'Golo Kante marked his 150th Chelsea appearance with a deserved opening goal, before City hit back to lead at the interval thanks to Kevin De Bruyne's deflected strike and a fine solo effort from Riyad Mahrez.
But Sunday's (AEDT) victory was marred by injury concerns for Rodri, David Silva and Sergio Aguero.
City lost at title rival Liverpool in its last game before the international break but crucially got back to winning ways despite a strangely low-tempo performance at Etihad Stadium, where three key players limped off during the second half.
Defeat for Frank Lampard's side ended a six-game winning streak in the league and denied the Blues the chance to set a club record of eight straight victories away from home in all competitions.
Chelsea was the better side initially and opened the scoring in the 21st minute, Kante bursting through a gap in City's defence to meet Mateo Kovacic's lofted pass, hold off the challenge of Benjamin Mendy and squeeze a clever finish past Ederson.
City was soon level, though, De Bruyne equalising against his old club when he sold Jorginho a dummy and saw his shot take a decisive deflection off Kurt Zouma, and they led before half-time.
Mahrez collected the ball in the left channel, skipped inside away from Kovacic and Emerson Palmieri and fired a superb low shot through the legs of Tomori to beat Kepa Arrizabalaga.
Chelsea was fortunate not to be 3-1 down at the break, Kepa's loose pass presenting Aguero with a clear sight of goal that the striker wasted by hitting the crossbar.
City lost Rodri and Silva after the break, prior to Kepa making a fingertip save to deny De Bruyne his second, while Aguero also hobbled out of the action to join City's growing injury list.
Ederson made a brilliant flying save to keep out Willian's drive, though a goal kick was incorrectly awarded, and substitute Mason Mount curled a late free-kick wide before Raheem Sterling had a third for City disallowed for offside by VAR (video assistant referee).