Mario Pasalic sealed victory for Milan after Donnarumma had spurned Dybala, who also missed a gilt-edged extra-time chance.
Juve’s Mario Mandzukic also missed from 12 yards, with Gianluca Lapadula reprieved having failed to convert for Milan.
In the match itself, captain Giorgio Chiellini put Juve ahead 18 minutes, but Giacomo Bonaventura levelled with a header prior to half-time.
Alessio Romagnoli hit the bar for Milan as Vincenzo Montella’s men shaded the second half, before having to withstand heavy Juve pressure as 30 minutes of extra time failed to produce a winner.
The win on penalties mean Milan now join Juve in having won the trophy a record seven times, with Montella claiming his first silverware with the Rossoneri.
Massimiliano Allegri’s men, meanwhile, have appeared in five straight editions of the Supercoppa, winning three – but losing on the two occasions it has been played in Qatar.
Juve had made a strong start to the match, with Mandzukic and Stefano Sturaro testing Donnarumma, but the teenage goalkeeper was helpless to prevent Chiellini’s flicked header from a Miralem Pjanic corner flying beyond him.
Allegri’s men were in control, but they lost Alex Sandro through injury and suffered more frustration when Milan moved level after 38 minutes.
Suso drifted in from the right and sent in an in-swinging cross which was impressively headed in by Bonaventura – a slight deflection off Stephan Lichtsteiner gave Gianluigi Buffon no chance on his 600th Juve appearance.
Milan almost completed the comeback early in the second half, Romagnoli’s deft header hitting the bar from another brilliant Suso delivery.
A thrilling Supercoppa continued with Donnarumma making a superb save from Sami Khedira’s 20-yard drive at the other end after Gonzalo Higuain had created the opportunity.
Allegri brought on Dybala in a bid to settle a balanced tie and the striker fired narrowly wide shortly after his arrival, before testing Donnarumma with another effort.
Milan’s main chances were coming in the air and Carlos Bacca had an aerial effort beaten away by Buffon, with in-form Suso again the creator.
That save ensured the match moved into extra-time, where Buffon denied Bonaventura and Bacca somehow failed to turn in the rebound from close range, Chiellini making the key block.
Higuain had a penalty claim turned rejected for Juve after going down under pressure from Gabriel Paletta, while substitute Patrice Evra had a goal correctly ruled out for offside.
Dybala missed the best chance of the additional period, blazing over from Evra’s cross before the Juve defender was fuming at another failed penalty appeal – this time for a Mattia De Sciglio handball – as the match moved to spot-kicks.
In the shoot-out, Buffon kept out Lapadula to give Juve the advantage, only for Mandzukic to power an effort against the bar.
Both teams were level at 3-3 after four penalties each when Donnarumma made a tremendous save from Dybala, allowing Pasalic to seal victory.