Robert Lewandowski struck his 20th goal of the season in the 77th minute to leave Dortmund six points clear of Bayern with four games remaining.
"Dortmund are 99 percent certain to be champions," acknowledged Bayern chairman Karl-Heinz Rummenigge.
The home side also equaled Bayer Leverkusen's Bundesliga record of 24 games unbeaten.
"I think it was the best game we played against them," Dortmund coach Juergen Klopp said after his side's fourth consecutive win over Bayern. "I think of the penalty and that he stops it. That's unbelievable."
Roman Weidenfeller missed the ball and brought Robben down in the penalty area in the 85th, but the Dortmund goalkeeper guessed the right way to deny the Dutchman a minute later.
"I think in the last three years I've taken 10 or 11 penalties and converted them all," Robben said. "That's the first I missed, and at such a time. It's bitter."
Dortmund defender Neven Subotic — who had taunted Robben after his penalty miss — then hit his own crossbar in injury time, with Robben firing the rebound over with the goal at his mercy.
"That happens in football," Bayern coach Jupp Heynckes said after what he called "an absolutely great game from both teams."
There was still time after Robben's miss for Lewandowski to hit the crossbar at the other end.
Third-place Schalke was unable to take advantage of Bayern's loss by slumping to a 4-1 defeat at Nuremberg, Hoffenheim routed Hamburger SV 4-0, Hannover beat Wolfsburg 2-0 in a battle to qualify for Europe, and bottom side Kaiserslautern is almost certainly relegated after losing 3-1 at Bayer Leverkusen.
More than 450,000 fans applied for tickets for Dortmund's likely title decider with Bayern, which had been billed by German media as "the game of games."
"If Dortmund win they'll be champions. If Bayern win they'll have it their hands to become champions," said former Bayern great Franz Beckenbauer — before tipping a 2-2 draw.
The home side started strongly, with Jakub Blaszczykowski beating the offside trap and flashing a shot wide early on.
Bayern goalkeeper Manuel Neuer denied Kevin Grosskreutz from point blank in the sixth, before gathering Lewandowski's attempt from the rebound.
Dortmund's suffocating defense prevented Bayern from settling into the game, and the visitors looked lethargic and short of ideas.
Bayern's play was best summed up when Franck Ribery's wonderful backheel set David Alaba free on the right, only for the Austrian's harmless cross to be easily cut out by a defender.
Lewandowski struck the left post with a header in the 37th, before Jerome Boateng scrambled the loose ball away.
Dortmund finally scored after a corner, when Grosskreutz tried his luck from range and Lewandowski's flick with his back to goal deflected the ball beyond the helpless Neuer.
"A lot can happen still. Our friends from Gelsenkirchen are bound to make it difficult for us already in the next game," said Klopp, looking ahead to Saturday's local derby against Schalke.
Bayern will console itself if it gets past Real Madrid to reach the Champions League final in its own stadium and will meet Dortmund again in the final of the German Cup.
"The league's no longer in our hands," Neuer said. "But we're not going to give up."