Bayern were dominant early on as Thomas Muller struck from Dante's pass before Mario Gotze scored following a corner.
David Silva pulled a goal back from close range after Jesus Navas's cross.
Aleksandar Kolarov equalised with a penalty after James Milner was tripped before Milner's fine finish won it.
Bayern's last three home defeats in European competition have come against English clubs - Manchester City, Arsenal and Chelsea
It was an amazing turnaround from Manuel Pellegrini's side, who almost earned the 4-2 victory they needed to go through as group winners as Alvaro Negredo had a late effort saved by Bayern goalkeeper Manuel Neuer.
But after Bayern scored twice in the opening 12 minutes, the fact City fought back to claim an unexpected victory will give them confidence as they progress to the last 16 for the first time.
Although Bayern and City both finished with 15 points, the German side's 3-1 win during the first group game in Manchester meant their better goal difference proved crucial.
Both teams had already qualified before this game but Bayern boss Pep Guardiola was clear that finishing second in the group - and thus facing a seeded team in the first knockout round - was "not an option".
But his team looked vulnerable as they suffered only their third defeat of 2013 with Silva and Milner excellent throughout.
Media playback is not supported on this device
It started with the Germans in imperious form as City looked nervous after an early a mix-up between Joleon Lescott and recalled goalkeeper Joe Hart.
And after five minutes the visitors were undone as Dante's diagonal pass caught Kolarov napping and Muller nipped in behind the City captain to finish past Hart.
Hart had to save Dante's header and turned Ribery's effort onto the post after another Lescott mistake before Bayern went 2-0 up from the resulting corner.
Mario Mandzukic had time to shoot towards goal and his effort found Gotze, who also had space to stroke the ball past Hart from close-range.
By this stage, the only question was how many goals Bayern would score. Hart had made four touches, and two of them were to pick the ball out of the net.
Matters appeared to worsen when Micah Richards was replaced at right-back by Pablo Zabaleta after pulling a hamstring but the introduction of the experienced Argentine seemed to galvanise the visitors.
Source: Uefa CL regulations
Shortly after a decent passage of play, City grabbed a goal back. Silva, on his return to the team after a calf injury, tucked in after Milner had headed Navas's right-wing centre back across goal.
After a frantic first half, City continued to improve but in the space of three minutes either side of the hour mark, the game then flipped on its head.
Silva was the architect as he played in Milner, who was brought down by Dante in the penalty area. Kolarov sent Neuer the wrong way from 12 yards.
Spanish midfielder Silva then set Navas free down the right and Milner curled a beautiful shot in at the back post after Bayern's Jerome Boateng had missed the cross,
Substitute Negredo could have made it a perfect night when Neuer saved his shot before Pellegrini chose to bring on Jack Rodwell instead of Sergio Aguero as they chased a fourth goal.
Whatever the group placings, this was an incredible way for City to flex their muscles before hosting Premier League leaders Arsenal on Saturday.
To see a gallery of images from today's Premier League games go to the BBC Sport Facebook page
Manchester City staged a superb comeback to end Bayern Munich's record run of 10 consecutive Champions League wins but they still finished as Group D runners-up behind the German champions.