The South Korea international raced through to finish following a mistake by Bjorn Engels to cap a frenetic afternoon at Villa Park.
Engels, playing in place of Tyrone Mings who missed out through illness, had earlier netted his first goal for the club to bring the match level at 2-2.
That came after he had also given away the penalty which allowed Son to put Spurs 2-1 up at the break, after Toby Alderweireld had scored at both ends of the pitch.
Alderweireld put through his own net after nine minutes to give Villa what was then a deserved lead.
But from the moment the Belgian equalised just before the half-hour mark, Spurs created a host of chances and while Villa were always in the game, they were ultimately guilty of making one mistake too many as Engels allowed the ball to run under his foot and Son raced through to finish past Pepe Reina.
The latter had earlier denied the Korean on three occasions, even saving his first-half penalty before the Spurs man tucked in the rebound.
Villa, who remain a place and a point above the relegation zone, can take heart from an attacking performance which rated among their best of the season.
But defensively they were always shaky and Son’s winner was the 50th goal they have conceded in the Premier League this season. That statistic, more than any other, is the reason they enter the final 12 games of the campaign with survival still very much in doubt.
Mings’ absence was the surprise and major team news for the hosts, Engels handed a first Premier League start in almost two months in place of the England international.
Smith also opted to make a chance in midfield, with Danny Drinkwater replacing Marvelous Nakamba.
It was to be another of Villa’s January signings, Samatta, who set the tone from the opening seconds, barging Alderweireld off the ball.
Grealish, meanwhile, was causing all kinds of problems for visiting right-back Serge Aurier. The Frenchman somehow escaped a without a booking despite crudely bringing down Villa’s skipper on three occasions, the first of which saw El Ghazi fire a free-kick narrowly over the bar.
El Ghazi would then play a key role in Villa’s opener. Picking up the ball on halfway, he burst down the flank before sending in a cross which nicked off the leg of Ben Davies. With the ball then spiralling dangerously toward the six-yard box and Samatta lurking, Alderweireld could only deflect it past Lloris and into the net.
The disappointment was that Villa did not then further increase their lead.
Grealish twice went close, first with a shot which flicked off the heel of Eric Dier before flying wide, then with another effort which flew just past the other upright.
Villa’s skipper then burst past Alderweireld to tee up Douglas Luiz for what looked certain to be the home side’s second goal but the Brazilian’s shot from eight yards out hit Davies and flew over the bar.
It proved a crucial moment as soon after Spurs were level. Villa were guilty of switching off at a corner and when the ball dropped in the box, Alderweireld hooked a finish into the roof of the net.
Even then, Villa’s response was encouraging, El Ghazi bringing a sharp save out of Lloris with a low piledriver.
But at the back the hosts were now looking vulnerable. Dele Alli should have done better than shoot wide after breaking into the right-hand side of the box, while Villa survived a VAR check when, after Ezri Konsa had blocked from Alli, Engels blocked Bergwijn’s shot with his chest.
The defender was not so fortunate on the stroke of half-time, however, when he slid in desperately as Bergwijn raced into the box. The attacker ended up on the floor but while referee Atkinson initially awarded no spot-kick, a VAR check showed the Belgian defender had made no contact with the ball.
Further frustration was to follow for Villa as though Pepe Reina guessed right to keep out Son’s penalty, the Korean was quickest to react to tuck home the rebound.
Spurs began the second half brightly but nine minutes in it was Villa’s turn to strike against the run of play.
Engels, just like fellow Belgian Alderweireld, earned redemption by rising to head home Grealish’s corner for his first goal for the club.
Back level, Villa’s defence still looked shaky and Bergwijn should have done better than shoot straight at Reina from the edge of the box, after Hause lost possession deep in his own half.
The Spanish keeper then preserved parity when he denied Son, diving to his right, after the attacker had got past Engels with relative ease.
At the other end, Lloris had to be alert to clutch and hold an El Ghazi header after Engels had climbed to meet another corner.
But it was Spurs who were now getting the big chances. Marvelous Nakamba, on as a substitute, dived in to block a Bergwijn shot over the bar, before Reina denied Alli one-on-one after Konsa had failed to cut out a through ball.
Villa seemed to be finding a second wind as the game moved inside the final 15 minutes but they were unable to create a clear-cut chance.
Instead it was Reina to the rescue again as he twice denied Son in quick succession, the second time after the hosts had again failed to clear a corner.
It looked as though Villa had done enough to earn a point until with seconds remaining, Son finally found a way through.
9 GOAL - Villa’s bright start pays off as Toby Alderweireld diverts Anwar El Ghazi’s cross into his own net.
27 GOAL - Tottenham level against the run of play as Alderweireld hooks home the loose ball after Villa fail to clear a corner.
45+2 GOAL - Son Heung-Min puts Tottenham in front, converting the rebound after Pepe Reina saves his penalty.
54 - GOAL - Villa are back level when Bjorn Engels rises to head home Jack Grealish’s corner.
90+4 GOAL Son wins it at the death for Spurs.
Villa (3-4-3): Reina, Konsa, Engels, Hause, Guilbert, Drinkwater (Nakamba 60), Luiz, Targett, El Ghazi (Trezeguet 70), Samatta (Baston 83), Grealish Subs not used: Elmohamady, Taylor, Hourihane, Nyland (gk).
Tottenham (4-3-3): Lloris, Aurier, Alderweireld, Sanchez, Davies, Dier (Lo Celso 60), Winks, Alli (Fernandes 83), Bergwijn, Son, Lucas Subs not used: Vertonghen, Ndombele, Skipp, Tanganga, Gazzaniga (gk).