The ART Grand Prix driver started from a GP2-record seventh pole position and held the lead from fast-starting Rapax driver Sergey Sirotkin.
Having begun on the super-soft Pirelli tyres, Vandoorne was among the first to make a pitstop at the end of lap seven.
A slow tyre change on the left-rear of the car meant that Sirotkin and Vandoorne's team-mate Nobuharu Matsushita, who both pitted a lap later, emerged from the pits ahead of the Belgian.
Vandoorne: I had to dominate GP2
Although they were battling for a place well down the order this was a battle for the de facto race lead, with Vandoorne getting past Matsushita easily.
He then passed Sirotkin into the first corner on lap 10; but while he had won that battle he had to ensure that he was close enough to the leaders, who started on the medium-compound Pirellis and therefore ran much longer, to retake the lead when they stopped.
This boiled down to a battle with DAMS driver Alex Lynn, who had a disappointing qualifying session and started ninth on the grid.
Lynn was frustrated to lose time behind team-mate Pierre Gasly, who was struggling thanks to front-wing damage sustained at the end of the first lap.
He eventually cleared the Frenchman, but realistically the time lost did not make any difference in his battle with Vandoorne as the McLaren junior was too far ahead.
Vandoorne set some rapid laps once in clear air after clearing some of the slower cars that stayed out on the mediums, meaning that he took a commanding lead ahead of Sirotkin when Lynn and the other leaders finally pitted during the closing 12 laps of the race.
Vandoorne crossed the line 11.7 seconds ahead of Sirotkin, while Lynn had to battle his way past Racing Engineering driver Alexander Rossi and Matsushita to take third.
Lynn had emerged from the pits in third just ahead of the pair, who then motored past on the run to Turn 2.
But both had a tyre disadvantage, and Lynn passed Rossi into Turn 3 with four laps remaining and then Matsushita on the penultimate lap to secure third.
Lynn wasn't close enough to Sirotkin to challenge for second, finishing 3.5s behind.
Matsushita finished a career-best fourth ahead of Russian Time driver Artem Markelov, while Rossi, who seemed to be struggling for grip, ended up sixth ahead of Rio Haryanto.
Nick Yelloly, who had a strong race for Hilmer Motorsport, earned pole position for Sunday's sprint race with eighth place ahead of Arthur Pic and Mitch Evans.
Red Bull-backed Gasly finished 13th behind Racing Engineering's Jordan King, with Ferrari protege Raffaele Marciello running at the sharp end early on but fading to 15th.
1. Stoffel Vandoorne ART Grand Prix
2. Sergey Sirotkin Rapax
3. Alex Lynn DAMS
4. Nobuharu Matsushita ART Grand Prix
5. Artem Markelov RUSSIAN TIME
6. Alexander Rossi Racing Engineering
7. Rio Haryanto Campos Racing
8. Nick Yelloly Hilmer Motorsport
9. Arthur Pic Campos Racing
10. Mitch Evans RUSSIAN TIME
11. Robert Visoiu Rapax
12. Jordan King Racing Engineering
13. Pierre Gasly DAMS
14. Julian Leal Carlin
15. Raffaele Marciello Trident
16. André Negrao Arden International
17. Rene Binder Trident
18. Marco Sorensen Carlin
19. Marlon Stockinger Status Grand Prix
20. Norman Nato Arden International
21. Daniel De Jong MP Motorsport
22. Simon Trummer Hilmer Motorsport
23. Richie Stanaway Status Grand Prix
Vandoorne seals GP2 title in Russia
Rossi wins after Lynn crashes out