The Hammers last beat City in September 2015 but Michail Antonio's magnificent overhead kick gave them an 18th-minute lead.
City produced more of the ponderous play that saw it drop points against Leicester City and Leeds United until Phil Foden came off the bench to inspire its most convincing passage of the match.
Foden struck a 51st-minute equaliser but, as it did in the first period, Pep Guardiola's side tailed off and even the appearance of a fit-again Kevin De Bruyne from the bench could not inspire a victory.
City has eight points from five games and is 11th, below West Ham on goal difference.
Raheem Sterling drove at West Ham's defence amid a bright start from City, with Sergio Aguero's resulting shot deflected behind by Vladimir Coufal.
Ilkay Gundogan was prominent early on, driving wide left footed before picking out Ruben Dias with a raking pass that the centre-back could not finish.
But the opening goal came against the run of play – and spectacularly so – as Antonio outmuscled Dias to find a sensational finish from Coufal's cross, with Tomas Soucek's suspected handball in the build-up cleared by VAR (video assistant referee).
City was thoroughly lacklustre from the point it fell behind until half-time, although Foden's introduction in place of Aguero – potentially another addition to Guardiola's hefty injury list – changed the complexion of the contest.
The England youngster injected some much-needed tempo into the visitors' play, not least when Joao Cancelo tore down the West Ham right and crossed for Foden to slot home a fine finish.
West Ham also lost its centre-forward, Antonio limping out of the action just after the equaliser. His replacement Andriy Yarmolenko sent a dipping long-range effort just over in the 68th minute.
De Bruyne thudded a free-kick into Lukasz Fabianski's chest 10 minutes and the points were shared when the West Ham goalkeeper thwarted Sterling in a one-on-one situation.
City will look to make it two wins from two in the UEFA Champions League when it travels to Marseille in midweek, while West Ham has another tall task at Liverpool next weekend. Guardiola's side is next in Premier League action at Sheffield United.