The Spain striker struck just after the hour mark before Federico Chiesa's improvised finish and a late Cristiano Ronaldo strike secured an important three points for the Serie A champions.
Having been held to a draw by Hellas Verona last time out, this was an important match for Andrea Pirlo's men, although they looked far from their best in a frustrating first-half performance.
The introduction of Morata helped to turn the tide as Juve moved to within seven points of Inter and three of second-placed Milan, with Ronaldo's effort making the Portugal star the first player to score 20 goals in each of the past 12 seasons in Europe's top-five leagues.
Riccardo Marchizza nearly caught Juve cold seven minutes in, turning and shooting just wide of the left post following Diego Farias' pass.
There was little Juve threat to speak of until Ronaldo, making his 600th career league appearance, smashed a strike off the base of the post three minutes before the break.
The home side's best work was coming down the left, Weston McKennie almost capitalising on a loose backpass and Dejan Kulusevski sending over a cross that Ronaldo could not meet with conviction.
Spezia did not heed the warning and substitutes Federico Bernardeschi and Morata combined from that same position, the latter finishing at the near post and the goal awarded after a VAR review.
With Morata keeping the Spezia defence busy, Kulusevski found Chiesa in the box and, after his initial shot was saved, he expertly hooked in the rebound for 2-0.
Ronaldo was frustrated by goalkeeper Ivan Provedel from a free-kick but left the keeper with no chance, netting a crisp finish a minute from the end of normal time.
Wojciech Szczesny did not have a save to make until the final kick of the match, when he pushed away Andrej Galabinov's tame penalty to deny the visitors a consolation.