Luis Alberto struck to put the hosts in front in the first half, but they were pegged back after the break by Giacomo Raspadori’s first top flight goal and Caputo’s late tap-in.
The result leaves second-placed Lazio seven points behind Serie A leaders Juventus, who face Atalanta later on Saturday, while the visitors’ impressive form continued as they chalked up their fourth win in a row.
Sassuolo coach Roberto De Zerbi handed 20-year-old striker Raspadori his first ever Serie A start as he made nine changes from the side that defeated Bologna in midweek.
There was a fast start at the Olimpico despite the blistering heat of the Roman afternoon, as after just eight minutes Raspadori netted his first Serie A goal with a neat close-range finish, only to be denied when referee Marco Di Bello ruled out the strike for offside following a VAR review.
The hosts had another let-off soon after when Filip Djuricic’s deflected shot looped over Thomas Strakosha and rattled the crossbar, before the hosts raced down the other end and Alberto fired wide unmarked from 12 yards out.
Lazio took the lead after 34 minutes when the energetic Manuel Lazzari bombed to the byline and cut a pass back to Alberto, whose deflected shot looped into the net.
But Raspadori and Sassuolo eventually got their goal early in the second half. Alberto was robbed of possession and substitute Caputo raced onto a through ball before squaring to the youngster for a simple finish.
The visitors then had a glorious chance to complete the comeback on the hour mark, when Mert Muldur’s strike was well saved by Strakosha and Djuricic turned the rebound wide with the goal gaping.
But Roberto De Zerbi’s side secured a deserved win in the dying minutes when Gian Marco Ferrari headed a free-kick into the path of Caputo to nod in from a yard out.