Kovalchuk fought off a check by P.K. Subban in front of the Canadiens' net and steered in a pass from Colin White 4 minutes into the game to put the Devils up 2-0, later adding an empty-netter in the victory.
Dainius Zubrus also scored for the Devils, who won for the ninth time in 12 games.
Martin Brodeur started and played the first period, stopping all 11 shots he faced, then was replaced by Johan Hedberg, who made 14 saves. Brodeur was removed after what appeared to be a minor, undisclosed injury.
Subban scored and Carey Price turned aside 26-of-29 shots for the Habs, who saw their three-game winning streak snapped.