Stuttgart striker Tanguy Coulibaly, 19, fired the hosts into a shock early lead after a cross caught Bayern centre-backs David Alaba and Jerome Boateng napping.
Kingsley Coman equalised with a superb low finish before Lewandowski drilled home from 20 metres to put Bayern 2-1 up at the break.
Brazil winger Douglas Costa, a second-half replacement for Coman, grabbed Bayern’s late third goal to seal a win which leaves the holders two points clear of RB Leipzig.
Bayern coach Hansi Flick admitted the dense fixture list is taking a toll on his team who qualified for the last 16 of the Champions League in midweek as group winners with two games to go.
“I’m happy with the result – we all know that it’s not easy to play every three days and I know we can play better,” said Flick.
Bayern face Atletico Madrid away on Tuesday in Europe.
Flick is waiting on Boateng, Corentin Tolisso, Lucas Hernandez and Javi Martinez who all picked up knocks against Stuttgart.
– Dortmund crash –
Dortmund are third, four points behind Bayern, after crashing to a shock 2-1 home defeat against Cologne, who ended an 18-match winless run.
Tunisia midfielder Ellyes Skhiri tapped in both Cologne goals from corners by ex-Dortmund winger Marius Wolf after being left unmarked.
With Dortmund 2-0 down on 60 minutes, coach Lucien Favre brought on three forwards — 16-year-old sensation Youssoufa Moukoko, Giovanni Reyna and Thorgan Hazard.
Reyna, 18, set up Hazard to pull a goal back, but it was too little, too late.
After scoring six goals in his previous two games, Dortmund striker Erling Braut Haaland was held in check, squandering a golden chance to equalise just before the whistle.
Cologne held on for their first win in Dortmund since 1991.
“Cologne were very well organised and we weren’t patient enough,” said Dortmund boss Favre.
“We needed a bit more tempo and there wasn’t enough movement.”
– Nagelsmann fumes –
Leipzig climbed to second after a 2-1 home win over plucky strugglers Arminia Bielefeld.
Leipzig head coach Julian Nagelsmann described it as their “worst performance this season”.
“We let five of six clear chances go begging,” he added.
Manchester City loanee Angelino gave Leipzig a first-half lead after a superb pass by 18-year-old Lazar Samardzic split the Bielefeld defence.
Just 60 seconds after coming off the bench, forward Christopher Nkunku netted Leipzig’s second goal early in the second half.
Much to Nagelsmann’s annoyance, second-from-bottom Bielefeld finished the stronger.
Their captain Fabian Klos pulled a goal back, just after Leipzig striker Alexander Sorloth had his penalty attempt saved on 73 minutes.
Union Berlin are sixth after their action-packed 3-3 draw at home to Eintracht Frankfurt.
Max Kruse converted a penalty as Union raced into an early 2-0 lead, only for Portugal forward Andre Silva to net twice as Frankfurt led 3-2 late on.
Former Germany striker Kruse, 32, bagged a superb strike to claim his sixth goal in nine games to equalise just before the whistle.
Freiburg are winless in their last eight games after a 1-1 draw at Augsburg.
Wolfsburg are fifth after their 5-3 win over Werder Bremen on Friday.
Dutch striker Wout Weghorst struck twice for Wolfsburg while Bremen had goalscorer Kevin Moehwald sent off for a second booking.