The champions started the game strongly and took the lead on 25 minutes. Rodrigo Bentancur slid in a low cross for Ronaldo to slot past goalkeeper Thomas Strakosha.
Lazio equalised in stoppage time at the end of the first half, though, when Luiz Felipe powered Luis Alberto's cross past Wojciech Szczesny to send the two sides in at the break on level terms.
Juventus were reduced to 10 men midway through the second half. Juan Cuadrado was shown a straight red card for a cynical foul on Manuel Lazzari after a VAR check.
Lazio made the most of their man advantage and took the lead three minutes later. Alberto produced another fine delivery for Sergej Milinkovic-Savic to latch on to and drill past Szczesny.
The Juventus goalkeeper saved a penalty from Immobile in the closing stages to keep his side in the contest, but substitute Felipe Caicedo finished the champions off in stoppage time.
The two sides played out a frantic first half that saw chances at both ends of the pitch. Immobile had an early effort deflected over the crossbar by Matthijs de Ligt, while Lazio needed Strakosha to parry a swerving Paulo Dybala shot clear on nine minutes.
The fast pace was unrelenting and allowed Juventus to carve Lazio open for the first goal. Dybala sent Bentancur in behind the Lazio defence, and his perfectly weighted cross was converted by Ronaldo.
Football pundit Mina Rzouki was impressed with Juve in the early stages:
Lazio hit back and claimed for a penalty when Immobile went to ground just inside the penalty area under pressure from Cuadrado but saw their appeals waved away. Immobile also sliced a volley wide at the far post from a Manuel Lazzari delivery.
The two players combined again shortly before half-time. Immobile made a good run to connect with Lazzari's cross but could only direct a tame effort straight at Szczesny.
Juventus were still a threat at the other end. Ronaldo came close to a second goal after good work from Federico Bernardeschi. He got to the byline and stood up a cross for Ronaldo to plant a header goalwards that Strakosha just managed to push to safety.
The equaliser eventually arrived right on the stroke half-time, as Felipe glanced Alberto's whipped cross home:
The second half was a far tighter affair until Juventus were reduced to 10 men on 69 minutes. Cuadrado brought down Lazzari, after he had knocked the ball past him, and was originally shown a yellow card.
However, the booking was upgraded to a straight red after a VAR check.
Football writer Adam Digby said it was a good call:
Lazio capitalised on the sending off and went ahead through a moment of real quality from Milinkovic-Savic.
Luis Alberto picked up his second assist of the night with a chipped pass that the midfielder controlled with his right foot and finished with his left (video UK only):
Lazio ought to have made it 3-1 from the penalty spot after Szczesny was penalised for a trip on Correa, but the goalkeeper quickly made amends with a brilliant double stop.
The goalkeeper guessed the right way to save Immobile's penalty and was then up quickly to deny the striker again on the follow-up:
However, Szczesny could do nothing to prevent Lazio sealing all three points late on. The Pole managed to parry Lazzari's initial shot but was powerless to prevent Caicedo firing home the hosts' third.
The result hands manager Maurizio Sarri a first defeat as Bianconeri coach and sees Lazio moves three points behind Juventus and just five behind leaders Inter Milan.
Juventus conclude their UEFA Champions League group-stage campaign on Wednesday at Bayer Leverksen with qualification already assured. Lazio travel to France to play Rennes in the UEFA Europa League on Thursday.