Stefano Pioli's side scored all of their goals within a 20-minute spell either side of half time as they blew their hosts away and boosted their hopes of reaching the last 16.
Matteo Gabbia, Rafael Leao and Olivier Giroud were all on the scoresheet for the visitors before the hour mark, and an unfortunate own goal from Robert Ljubicic capped off a miserable night for Zagreb.
Milan now sit three points behind Group E leaders Chelsea, who sealed their place in the last 16 with victory over Red Bull Salzburg earlier on Tuesday evening.
Zagreb's hopes of reaching the knockout rounds are now over, meanwhile, with third place and a spot in the Europa League the best they can hope for heading into the final matchday.
Both sides created openings in the first half before Milan broke the deadlock through Gabbia's diving header from Sandro Tonali's free kick six minutes before half time.
From then on, it was all about the visitors as they took the game away from their hosts in the second half, and it could have been even more than 4-0 in the end.
The in-form Leao continued his fine start to the season by doubling Milan's advantage four minutes after the restart, bursting through the heart of the defence before finishing confidently at the near post.
Two then became three just 10 minutes later when Tonali was hauled down inside the box, allowing Giroud to convert from the penalty spot and effectively wrap up the points before the hour mark.
Giroud had a number of other chances to add to his personal tally before the end of the game too, including one half-opening which inadvertently led to Milan's fourth.
The France international failed to connect with a cross from the left, but his unintentional dummy took Ljubicic by surprise and the ball bounced in off the hapless backtracking midfielder, who had run from the other end of the pitch in an attempt to help his side defend Milan's latest attack.
There was still time for the Italian champions to have a goal disallowed late on too, and while Zagreb enjoyed 54% of the ball in front of their own fans, Milan had 20 shots on goal and 10 on target throughout a deserved victory.
The result sees Milan extend their record against Zagreb to six wins from six previous meetings - at the same time Milan's best-ever record against an opponent in European competition and Zagreb's worst-ever record against a team in Europe.