The 25-year-old France captain has scored once in his last six matches for Madrid across all competitions, including three losses for Los Blancos.
Malick Thiaw headed the Italian side ahead before Vinicius Junior levelled from the penalty spot for the hosts.
Alvaro Morata struck against his former side to restore Milan’s lead before the break and Tijjani Reijnders netted the third to secure Milan’s victory.
Madrid were unable to bounce back strongly from the 4-0 thrashing by Barcelona in late October, their last outing after Saturday’s La Liga match at Valencia was postponed because of devastating floods in the east of Spain.
Players from both sides wore t-shirts before the match reading “We are all Valencia” while in one stand a giant Valencia regional flag was unfurled for a minute’s silence.
Carlo Ancelotti, who won the Champions League twice as a player and then twice as a coach with Milan, only made one change from the Clasico humiliation, bringing in Luka Modric for Eduardo Camavinga.
Madrid may have been keen to set things right in front of their fans at the Santiago Bernabeu but fell behind in the 12th minute.
Thiaw’s near-post header from a corner flew past the helpless Andriy Lunin to earn the Serie A side the lead.
Mike Maignan saved from Mbappe at the other end as Madrid hit back, with Vinicius winning a penalty as he fell under a clumsy tackle from Emerson Royal.
The Brazilian, who finished as runner-up in last week’s Ballon d’Or ceremony in Paris when he had been favourite to win, coolly dispatched it with a cheeky dinked Panenka effort.
Milan regained the lead in the 39th minute through former Madrid striker Morata, who reacted quickly to fire home after Lunin saved from Rafael Leao.
Mbappe, yet to find top form in a Madrid shirt since his move from Paris Saint-Germain and particularly frustrated in the Barcelona defeat, broke in again before half-time but Maignan saved his low effort.
Ancelotti took action at half-time, bringing on Camavinga and Brahim Diaz, and it opened up the second half for an end-to-end affair.
Lunin made a superb flying save from Leao’s header and the Portuguese forward wasted a couple of opportunities on the break.
Leao made amends by teeing up Reijnders at the end of a superb solo run to turn home for Milan’s third after 73 minutes.
Antonio Rudiger smashed home for Madrid after a poor Maignan punch but the goal was disallowed for a tight offside against the defender.
Maignan made a fine late save to deny Diaz and it killed any Madrid hopes of a comeback, like in their previous Champions League outing against Borussia Dortmund.
Madrid have now lost two of their four matches and are in the middle of the table, provisionally 17th, one place above Milan.