Bo Horvat also scored for the Canucks (10-15-2), who have won two of their past three games.
"It was one of our better games of the year," coach Travis Green said. "That's a really good hockey team over there and it's nice to get a win. I love how our team responded."
Vancouver played without center Elias Pettersson, who was a late scratch because of an upper-body injury and is day to day. Pettersson has scored 21 points (10 goals, 11 assists) in 26 games.
Michael Hutchinson made 24 saves for the Maple Leafs (18-5-2), who had won four in a row and lost in regulation for the third time in 20 games (15-3-2).
Toronto played the second of back-to-back games after it completed a three-game sweep of the Edmonton Oilers with a 6-1 win Wednesday.
"It's disappointing," Maple Leafs captain John Tavares said. "We really wanted to come in off of three really good games to build on that, to not take this one lightly and really continue to find growth and challenge ourselves. Obviously, it didn't go our way. We had some opportunities. We've probably got to make it a little more difficult around their net."
Virtanen gave the Canucks a 1-0 lead at 2:59 of the first period with his first goal and point in 18 games. He skated around defenseman Justin Holl off the rush for a shot in tight that bounced off and over Hutchinson before being knocked in by Holl as he tried to clear the puck.
"I don't think that fatigue was the main factor," Holl said. "I think Vancouver executed their game plan really well. They didn't give us a lot of time in the offensive zone. They were hard on pucks, they were moving it well. We have played a lot of games recently, but that definitely wasn't the reason. I thought we just got outplayed."