MacDonald, making his 11th start of the season, stopped 17-of-18 shots in a furious second period while the Flames were notching the tying and go-ahead goals.
Roman Cervenka forged a 1-1 tie with a tally midway through the middle frame and Cammalleri netted the decisive goal at the 16:41 mark when he took a feed from Roman Horak in the slot and one-timed a shot past Jean-Sebastian Giguere.
Alex Tanguay added a shorthanded score for the Flames, who broke a five-game losing streak.
Brad Malone scored and Giguere finished with 31 stops for the Avalanche.
Rosie O'Donnell unveils nearly 50-pound weight loss
Disney's 'Jessie' to feature network's first engagement