Kovalchuk, playing his first game since Nov. 9 with the Los Angeles Kings, had an assist on defenseman Ben Chiarot's second goal, which got Montreal within 3-2 at 11:47 of the third period.
The Canadiens had three shots the rest of the game, two with goalie Carey Price pulled for the extra attacker to give them a 6-on-4 power play after Jets defenseman Luca Sbisa was called for hooking at 16:43.
WATCH: [All Jets vs. Canadiens highlights]
"That's frustrating because Price, he gave us some unbelievable saves in the second to keep us in the game," Kovalchuk said. "And a few little mistakes cost us, but I like the way we fight to the end, and it says a lot that we never give up. So it's a bump in the road, but we're going to keep working and getting better. Tomorrow (at the Detroit Red Wings), it's a new day and a must-win for us."
Nikolaj Ehlers scored shorthanded and had an assist for Winnipeg (23-16-4), which won for the second time in seven games (2-3-2). Connor Hellebuyck made 29 saves.
"I thought both teams played a pretty good game, pretty exciting right to the end," Hellebuyck said. "And I thought we stuck with it and we battled hard and our [penalty kill] was great, so hats off to the guys in front of me tonight."
Price made 24 saves for Montreal (18-18-7), which is 0-5-1 in its past six games.
"We feel like we're playing the right way for the most part, just obviously not scoring as many goals as we need to," said Chiarot, who played 305 games in six seasons for the Jets before signing a three-year contract with the Canadiens on July 4, 2019. "Carey's playing great for us, giving us a chance to win every night. We're doing the right things, we're just not finishing around their net. So that's going to have to come by committee right now, and we're going to have to dig around their net a little harder."
Kovalchuk had four shots on goal and six hits in 19:25 of ice time after signing a one-year, two-way contract worth $700,000 with Montreal on Friday.