A third consecutive win for Red Bull – two for Verstappen and one for Sergio Perez – boosted their leads in both the drivers' and constructors' championships.
Verstappen looked to be in trouble when he let Hamilton through at Turn 2, but his team's strategy turned the race on its head, extending his advantage to 12 points in the standings.
The championship leader – starting from pole – kept his nose in front at Turn 1 but then ran wide, exiting the track to give up position to Hamilton, who looked at ease at the front of the race.
Pit strategy proved pivotal, though, as Mercedes called in Valtteri Bottas – running in third – before team-mate Hamilton.
Red Bull followed as Verstappen boxed, causing Mercedes to react again, calling for "Hammer time" from their lead driver before bringing him in for a 2.1-second stop, the fastest of the three.
However, a flying out lap from Verstappen meant Hamilton could not quite get out ahead of his rival, instead settling in behind the Dutchman for a lengthy battle alongside Bottas.
Verstappen worked hard to keep Hamilton out of DRS range and gradually built a gap to the fading Silver Arrows that encouraged Red Bull to gamble with another stop and a switch to medium tyres.
Perez, who pitted after the other three, let Verstappen through to quickly take chunks out of the Mercedes lead, with Hamilton warned of a "painful" finish.
Bottas failed to hold Verstappen up, opening a gap for the rapid Red Bull and fuming at his team for delaying a second stop, with Perez soon following his team-mate through.
Red Bull cut it fine, but Verstappen eased past Hamilton on the penultimate lap after only a short tussle to land a significant blow in a thrilling title race.