Kevin De Bruyne nearly added a third just before the break as City threatened to extend their lead, but his free kick from the edge of the box skimmed the roof of the net.
West Ham almost levelled shortly after halftime through a quick break as Mohammed Kudus hit the post, with the chance galvanising the home crowd and West Ham’s players.
But Haaland secured the win with another cool finish in the 83rd minute, charging on to Matheus Nunes’ through ball and lifting his shot over substitute keeper Lukasz Fabianski.
The striker followed up last week’s treble against Ipswich Town to record his seventh goal in three games this season and his 70th Premier League strike in 69 appearances.
He nearly scored a fourth in the fifth minute of added time but Fabianski saved his shot from a tight angle before Ederson denied Crysencio Summerville a late consolation.
City have three wins from three to open up an early two-point lead over last season’s runners-up Arsenal, who drew 1-1 at home to Brighton & Hove Albion on Saturday.
West Ham have three points from three games.