The 24-year-old Dutchman controlled a tactical race from pole position through three safety car interventions and resisted intense late pressure from Ferrari’s Carlos Sainz to win by under a second.
Seven-time world champion Lewis Hamilton, who on Friday declared his car as "undriveable", came home third for Mercedes to claim his second podium of a difficult season ahead of teammate George Russell in fourth.
It was Verstappen’s first Canadian victory in his 150th career start, his sixth this year and the 26th of his career, hoisting him 46 points clear of his rivals in the championship.
"I was giving it everything," said Verstappen. “But so was Carlos. He was pushing, charging, pushing, charging. Naturally, it’s easier to charge with DRS! I had fun today.”
Hamilton, a record seven-time winner in Montreal, cheered the big crowd – part of a weekend attendance of 338 000 – and said he was "overwhelmed to get third place. It’s been quite a battle, but we’ve never given up. I’ve been inspired by my crew."
Ferrari’s Charles Leclerc, who started at the back of the grid after taking a penalty for a new engine, finished fifth ahead of Esteban Ocon and his Alpine teammate Fernando Alonso, Valtteri Bottas and his Alfa Romeo teammate Zhou Guanyu.
Local hope Lance Stroll finished 10th for Aston Martin.
After Saturday's deluge, the race began with a mixed-up ‘wet’ grid – with Leclerc, Perez and several others out of their normal race positions – as Verstappen made a clean start from his 15th pole position to take control.
Behind him, Kevin Magnussen made a dazzling departure from fifth to challenge Hamilton, but the Briton resisted and retained fourth as the order settled, Russell making his move early to pass Mick Schumacher for seventh.
1. Max Verstappen (NED/Red Bull) 1h 36:21.757
2. Carlos Sainz (ESP/Ferrari) at 0.993
3. Lewis Hamilton (GBR/Mercedes) 7.006, 4. George Russell (GBR/Mercedes) 12.313
5. Charles Leclerc (MON/Ferrari) 15.168
6. Esteban Ocon (FRA/Alpine-Renault) 23.890
7. Fernando Alonso (ESP/Alpine-Renault) 24.945
8. Valtteri Bottas (FIN/Alfa Romeo) 25.247
9. Zhou Guanyu (CHN/Alfa Romeo) 26.952
10. Lance Stroll (CAN/Aston Martin-Mercedes) 38.222
11. Daniel Ricciardo (AUS/McLaren-Mercedes) 43.047
12. Sebastian Vettel (GER/Aston Martin-Mercedes) 44.245
13. Alexander Albon (THA/Williams-Mercedes) 44.893
14. Pierre Gasly (FRA/AlphaTauri-Red Bull) 45.183
15. Lando Norris (GBR/McLaren-Mercedes) 52.145
16. Nicholas Latifi (CAN/Williams-Mercedes) 59.978
17. Kevin Magnussen (DEN/Haas-Ferrari) 1:08.180,
FASTEST LAP:Carlos Sainz (ESP/Ferrari) 1:15.749 on lap 63 (average speed 257.207 km/h)
Did not finish:
Sergio Perez (MEX/Red Bull)
Mick Schumacher (GER/Haas-Ferrari)
Yuki Tsunoda (JPN/AlphaTauri-Red Bull)