Sarri's men were well below par for the visit of Stefano Pioli's Milan and Ronaldo was no different, as the Portugal star failed to inspire an Old Lady attack that looked bereft of creative ingenuity until matchwinner Dybala replaced the five-time Ballon d'Or winner.
Belying the form table, Milan looked considerably more fluent and inventive in attack during the opening 45 minutes, but questionable finishing and a wonderful save from Wojciech Szczesny prevented them going into half-time ahead.
Juve remained short of ideas going forward initially in the second period and that resulted in the withdrawal of Ronaldo – who was also hooked in the Champions League against Lokomotiv Moscow.
While the Portugal captain looked utterly unimpressed as he headed straight down the tunnel, Dybala made the difference late on with a fine goal to retain Juve's status as Serie A pacesetter.
Milan should have taken the lead with 18 minutes on the clock, but Krzysztof Piatek miscued his header from Suso's excellent delivery from deep, before Szczesny thwarted Lucas Paqueta's nodded effort.
It took Ronaldo until the 42nd minute to threaten the Milan goal, but his 25-yard strike was easily kept out by Gianluigi Donnarumma.
Sarri's response to Juve's ineffectiveness in front of goal was to withdraw Ronaldo for Dybala before the hour, while Douglas Costa – the hero in the 2-1 UCL win in Moscow – came on soon after.
The Brazilian went as close as any of his team-mates with a 30-yard strike that Donnarumma stopped, before Blaise Matuidi curled just off target.
But fittingly it was Dybala who got the decisive goal, as he played a one-two with Gonzalo Higuain on the edge of the box and then swept home right-footed 13 minutes from time, confirming an undeserved defeat for Milan, who have not won at Juve since March 2011.