Hamilton's 11th victory of the year, his joint-best haul in a single campaign, was never in doubt as he comfortably led from pole position, aided by Leclerc getting ahead of Verstappen on the first lap.
Verstappen executed a long first stint then caught and forced his way past Leclerc to secure second and finish a career-best third in the drivers' championship.
Poleman Hamilton streaked clear immediately at the start, as Leclerc used the slipstream to get ahead of Verstappen on the second of the two back straights.
The race remained stagnant until the two Ferraris pit on lap 12, with Leclerc far enough ahead of Sebastian Vettel not to hold up his teammate but Vettel subsequently losing time by a slow change of his left-rear tyre.
That meant Vettel rejoined behind Valtteri Bottas, who was running long after starting from the back of the grid, and Vettel lost time as the Mercedes struggled to clear the Renault of Nico Hulkenberg due to an issue that meant nobody was able to use the DRS through the first third of the grand prix.
At the front, Hamilton and Verstappen ran extremely long on their medium tyres, with Verstappen stopping on lap 25 and Hamilton coming in a lap later.
Verstappen complained of "massive lag" when he rejoined and would continue to ask for a solution to the problem despite showing no lack of pace and slowly closing on Leclerc.
Red Bull told Verstappen it could not fix the issue, but that did not stop Verstappen using the DRS to attack at the end of the first back straight and squeeze by on the inside.
Leclerc tried to fight back with an aggressive, late-on-the-brakes pass on the outside at the end of the following straight, but Verstappen was able to rebuff the attempt.
With Vettel dropping back in fourth and eventually pitting, and neither Alex Albon or Bottas within a pitstop, Ferrari switched Leclerc to 'Plan C' and pit him for a second time to set the fastest lap – which he failed to earn.
That left Verstappen free to secure a comfortable second place, 16.7 seconds behind race winner Hamilton, who pumped in the fastest lap on his penultimate tour to clinch a bonus point for good measure.
Leclerc completed the podium, but his third place is in doubt as Ferrari faces a stewards' inquiry into a "significant" pre-race fuel declaration discrepancy.
That means Bottas may yet be rewarded with a podium, having cleared Albon in the final third of the race to recover to fourth.
His progress from the back was slow early on because of the issue with the DRS, but strong pace thereafter eventually left him missing out on a podium to Leclerc by less than a second.
Vettel recovered some ground after his second stop by passing Albon for fifth with two laps to go.
Sergio Perez's long first stint paved the way for a late charge to best-of-the-rest in seventh.
The Racing Point driver started 10th but a later stop than his midfield rivals allowed him to charge past five cars over the last 17 laps and pass the McLaren of Lando Norris on the final lap.
Daniil Kvyat finished ninth for Toro Rosso, beating its constructors' championship rival Renault, but the Red Bull junior team's two-point haul meant Renault still secured fifth place in the constructors' championship.
Nico Hulkenberg looked set to sign off his three-year spell with Renault, and potentially his F1 career, with a point for 10th but was passed by the second McLaren of Carlos Sainz on the very last lap.
Sainz's last-gasp move secured him sixth place in the drivers' championship by just one point, ahead of Pierre Gasly.
|2||Max Verstappen||Red Bull||16.772|
|6||Alex Albon||Red Bull||1'09.205|
|7||Sergio Perez||Racing Point|
|9||Daniil Kvyat||Toro Rosso|
|10||Carlos Sainz Jr.||McLaren|
|13||Kimi Raikkonen||Alfa Romeo|
|16||Antonio Giovinazzi||Alfa Romeo|
|18||Pierre Gasly||Toro Rosso|
|Lance Stroll||Racing Point|