Michail Antonio was the Hammers' match-winner, scoring his seventh goal in all competitions this season in the 67th minute when he latched on to Marko Arnautovic's chip and sent a half-volley past Hugo Lloris.
The defeat puts a dent in Spurs' top-four push and will give Chelsea, Arsenal and Manchester United renewed hope that they can overhaul Mauricio Pochettino's team.
The visitors had the first goal scoring opportunity in the second minute but Declan Rice's 20-yard shot flew just over the bar after Felipe Anderson had created the chance.
Spurs responded and Son Heung-min's low shot was saved by Lukasz Fabianski before Lucas Moura's effort flew just wide.
As the home team began to get on top, South Korea international Son's shot was blocked on the edge of the penalty area while Fabianski made a great save to keep out Christian Eriksen's effort eight minutes before the interval.
Dele Alli had a penalty appeal ignored by the referee and Juan Foyth fired a low effort wide while at the other end Lloris kept out Anderson's deflected shot just before half time.
Spurs, who won at West Ham 1-0 in October thanks to Erik Lamela's first-half goal, started the second period slowly and they were a little fortunate not to fall behind when Ryan Fredericks was set up by Arnautovic only for his shot to be deflected over the bar.
Son went down under Arthur Masuaku's challenge but again referee Anthony Taylor was unimpressed and waved play on before Eriksen's free-kick was blocked by the Hammers wall.
Lethargic Spurs struggled to hit back after West Ham’s goal and they were a little fortunate not to fall further behind in the closing stages as Lloris did well to save Antonio's fierce effort before keeping out Issa Diop's shot after a rampaging run by the Hammers defender.
Spurs will be keen to bounce back from this setback when they face Ajax in the first leg of their Champions League semi-final on Tuesday.