The AG2r-La Mondiale rider attacked twice in the final climb, a brutal two-kilometre ascent at an average gradient of 6.
9 percent, and countered overall leader Chris Froome less than one-km from the line.
The 27-year-old Vuillermoz beat Ireland’s Dan Martin (Cannondale-Garmin) by five seconds while Spain’s Alejandro Valverde (Movistar) was 10 seconds behind in third place after a 181.5-km ride from Rennes.
“I really wanted to go for the stage win today, it was all or nothing,” Vuillermoz, a former mountain biker, told reporters.
Team Sky’s Froome, the 2013 champion, still leads Slovakian Peter Sagan (Tinkoff-Saxo) by 11 seconds and American Tejay van Garderen (BMC Racing) by 13 in the general classification.
“That was a tough climb, but my team mates did a great job in bringing me to the front, I was in the best position,” said Briton Froome, who once he realised Vuillermoz was gone focused on keeping pace with his rivals.
Defending champion Vincenzo Nibali of Astana lost 10 seconds to the other members of the Big Four (Froome, Spain’s Alberto Contador and Colombian Nairo Quintana).
“I was very surprised to hear that, especially with the cross headwind that made it easier to stay in the wheels,” Froome told a news conference.
Contador is seventh, 36 seconds behind Froome. Nibali is 13th, 1:48 off the pace with Quintana in 16th place, 1:56 adrift.
Inside the final kilometre, Froome upped the pace in typical fashion, glued to his saddle with his head bent down, but Vuillermoz hit back, suggesting he could be tough to handle in the mountains.
Vuillermoz, who took 11th place overall in the Giro d’Italia in 2014 in his second year as a professional, is supposed to ride in support of team mates Jean-Christophe Peraud and Romain Bardet, second and sixth overall in last year’s Tour.
Sunday’s ninth stage is a 28-km team time trial before the first rest day of the three-week race, which then heads to the mountains.
“In the Pyrenees the race for the yellow jersey will really start,” said Froome.
German Andre Greipel (Lotto-Soudal) lost the green jersey for the points classification to Sagan, who was fourth on the day.
Eritrea’s Daniel Teklehaimanot (MTN-Qhubeka) retained the polka dot jersey for the mountains classification, which he can expect to lose in the Pyrenees where the top climbers will start their battle.
(Reporting by Julien Pretot; Editing by Ken Ferris/Mark Meadows)