Sven Baertschi and Curtis Glencross also scored for Calgary (2-0-2). The last time the Flames recorded points in the first four games of a season was back in 2009-10 when they went 4-0-0 before going 0-2-1 in their next three games.
MacDonald started his third straight game after backstopping Calgary to a 4-3 road win over the Columbus Blue Jackets on Friday, before helping the Flames salvage a point in a 5-4 overtime loss at home to the Vancouver Canucks on Sunday.
Lars Ellar, with his fourth goal and sixth point, also scored for Montreal, while Carey Price made 22 saves.
Both Calgary and Montreal finished 1 for 3 on the power play.
Despite being outshot 12-4 in the opening frame by the Canadiens, the Flames took a 2-0 lead into the first intermission.
Monahan opened the scoring at 9:09 of the first period when he tapped a rebound into the net behind Price.
Monahan started the play with a behind-the-back pass to Lee Stempniak, who fired a shot on goal that Price stopped with his right blocker. The puck bounced right to Monahan, who drove straight to the net after making the pass.
Baertschi then scored his first of the season with 1:27 remaining in the first when he tapped a cross-crease pass from Monahan behind a sprawling Price. Jiri Hudler helped set up the play by jarring the puck loose from Montreal defenceman Jarred Tinordi by virtue of a big hit behind the net.
Early in the second, MacDonald stopped a shot shovelled his way by Montreal forward Daniel Briere with his right pad. At the other end of the ice, Price slid across his net to turn aside a shot fired his way by Glencross.
During a Montreal man advantage, MacDonald stopped a Subban point blast before stacking his pads to prevent back-to-back shots off the stick of Andrei Markov from getting into the net behind him.
Then on a Calgary power play, Glencross tipped a point shot by Dennis Wideman past Price at 16:22 of the second.
Just 84 seconds later with the Calgary captain Mark Giordano in the penalty box for tripping, Subban fired a point shot into the top corner to end MacDonald's shut-out bid.
At 10:40 of the third, Ellar pulled Montreal within a goal. Subban let go a shot from the point that went wide, but bounced off the boards and right onto the stick of Ellar, who swatted the puck into a wide-open net.
The Canadiens pressed hard to tie up the game until Subban took a cross-checking penalty with 1:49 remaining in regulation.
Notes: Montreal forward Rene Bourque played in his 500th NHL game. Bourque started his career in Chicago with the Blackhawks, with whom he played 183 games before suiting up for 249 contests with the Flames and the last 68 with the Canadiens. … Hudler's next goal will be the 100th of his NHL career. … Monahan, Stempniak and Hudler have all recorded at least one point all four games the Flames have played this season.