In a hard-fought game with a number of chances for both sides, it was Bayern who took the three points as Bremen finished the match win 10 men after Niklas Moisander was sent off.
Gnabry opened the scoring in the 20th minute against his former side and doubled up in the second half in reply to Yuya Osako’s 33rd-minute equaliser for Bremen.
A strong save from Jiri Pavlenka in the Bremen net denied Robert Lewandowski an early chance to take the lead as the game started at a high tempo.
After passages of end-to-end play, Joshua Kimmich cleverly worked his way past a couple of defenders to create space for a shot from the edge of the area which went just wide of the goal.
Gnabry scored from a rebound after his initial shot was saved by Pavlenka – the second attempt looped over the goalkeeper and into the back of the net.
Bremen almost equalised moments later when Theodor Gebre Selassie controlled a high ball to shoot but the attempt was saved by a low dive from Manuel Neuer.
After another chance for Nuri Sahin, Bremen equalised through an Osako header, the first headed goal Bayern have conceded this year.
A Max Kruse cross came in from the left and found the Japanese forward ahead of centre-backs Niklas Sule and Jerome Boateng, and Osaka made no mistake nodding the ball past Neuer to level the score.
Lewandowski had a second chance to put Bayern ahead again when Gnabry cleverly found the forward who then fired his shot well over the goal.
A crucial block from Moisander denied Thomas Muller the chance to take the lead for Bayern at the start of the second half, just before Gnabry grabbed his second goal after the ball deflected off Moisander and onto the knee of the Bayern winger and into the goal.
A long-range effort from David Alaba was the closest Bayern came to adding to their lead in the early stages of the second half despite their domination in terms of possession and chances.
Bremen nearly found an equaliser with their first clear-cut chance of the second half when a fingertip save from Neuer denied Kruse.
Moisander received a second yellow card offence in injury time, and will miss Bremen’s next match against Fortuna Dusseldorf.