The win, by a commanding 22 seconds at the chequered flag, was the 11th of the Dutch youngster’s career.
“It was very challenging out there, especially in the beginning to stay on track to be honest, it was very slippery,” he said of a race that started with most drivers on intermediates but some on full wets.
Hamilton, winner of the Bahrain season-opener, took a crucial bonus point for fastest lap on a rollercoaster afternoon for the seven-time world champion, whose race was almost wrecked by a rare mistake.
The Briton started on pole, his 99th, but dropped from second to ninth after skidding into the gravel and nudging the barriers at Tosa with his car at a standstill and a retirement looming.
He kept the engine running, reversed back out, returned to the pits and fought his way back to the podium with a stirring recovery drive after the race was stopped and restarted halfway through.
“On my side it was not the greatest days, it’s the first time I’ve made a mistake in a long time. But I’m grateful I was able to bring the car home today,” said Hamilton.
McLaren’s Lando Norris completed the top three in the first time two British drivers had stood together on the podium since 2012.
Hamilton now has 44 points to Verstappen’s 43, with Norris on 23. Mercedes stayed top of the constructors’ standings with 60 points to Red Bull’s 53.
Verstappen seized the lead into turn two on the opening lap, forcing his way through with a great start from third on the grid but making contact with the Mercedes as he went.
The race was halted due to debris after a big collision between Hamilton’s team mate Valtteri Bottas, who had started eighth, and Williams’ George Russell on lap 32 in a battle for ninth place.
There had been plenty of mayhem before then, with Canadian Nicholas Latifi smashing his Williams into the barriers and plenty of spins elsewhere.
Ferrari’s Charles Leclerc finished fourth and Spanish team mate Carlos Sainz was fifth, with McLaren’s Daniel Ricciardo sixth.
Canadian Lance Stroll was seventh for Aston Martin with AlphaTauri’s Pierre Gasly eighth and Kimi Raikkonen ninth for Alfa Romeo.
Frenchman Esteban Ocon took the last point for Alpine.