Mercedes had been expected to cruise to their fifth win from as many rounds this season.
But both Hamilton and Bottas struggled with their tyres to clear the way for Verstappen to take an unlikely win.
Indeed, the Dutchman had been a 12/1 outsider to take the chequered flag ahead of Sunday's race.
Charles Leclerc finished fourth for Ferrari ahead of Alexander Albon. Racing Point's Lance Stroll was sixth. Hamilton will head to next week's Spanish Grand Prix with a 30-point championship lead over Verstappen.
Hamilton's Mercedes team have been the class act in the field this year and, after pole-sitter Bottas beat Hamilton to the first corner, it looked as though it would be a straight fight between the all-black machines for victory.
But Verstappen, who moved ahead of Racing Point's Nico Hulkenberg at the opening bend, remained hot on their heels. Both Mercedes cars started on the medium rubber, with Verstappen on the more durable hard tyre.
Verstappen sensed that the Mercedes cars were struggling and was soon hunting down Hamilton. At one stage, he was told to drop off Hamilton's gearbox to protect his tyres.
"This is the only chance to beat Mercedes," he said over the radio. "I am not going to sit back like a grandma."
He remained true to his word. Bottas pitted from the lead on lap 13 with Hamilton following in for fresh rubber on the following lap. Verstappen took the lead and, when he came in for new tyres at the midway stage of the race, he left the pits just behind Bottas.
Verstappen took only a handful of corners to regain top spot after he resisted Bottas' tame defence, making the move stick on the exit of Luffield.
Both Verstappen and Bottas came in with 20 laps remaining for a second time, while Hamilton remained out on wearing rubber. Could the world champion get his tyres to the end of the race? The answer came on lap 41 of 52 when Hamilton boxed for fresh rubber.
Hamilton emerged down in fourth but the 35-year-old started to light up the time charts, posting the fastest lap of the race before taking Leclerc at Stowe for third. He then set his sights on hunting down Bottas and, with two laps to run, he got his man around the outside of Brooklands.
As Verstappen cruised to the flag, Hulkenberg finished seventh, while Sebastian Vettel was outside the points in 12th following an opening-lap spin.
"I didn't see it coming but after the first stint it seemed we were really good on tyres," Verstappen said after his ninth career win.
"We had a lot of pace in the car. I didn't have any tyre issues and we kept pushing.
"It was an incredible result to win, so everything worked out well and I am very happy."
Hamilton, who matched Michael Schumacher's record of 155 career podiums, said: "It was a massive challenge.
"Congrats to the Red Bull team and to Max. They didn't have the problems we had today.
"It was definitely unexpected to have the blistering as hardcode as we experienced – I was nervous the tyre was going to explode – but I am grateful I managed to progress and get through the race."