Villa suffered heartache for the second time in four days as they went out of the FA Cup at The Den.
Still reeling from Tuesday's Capital One Cup semi-final exit, Paul Lambert's men were sunk by an 89th-minute header from Millwall striker John Marquis.
Claret and blue hopes soared when record-signing Darren Bent opened the scoring following a superb run and shot by Andreas Weimann.
But the home side were level through skipper Danny Shittu five minutes later, and that late stunner had Villa reeling just when a replay looked inevitable.
Eric Lichaj, Weimann and Bent were involved in a dangerous early move down the right, but when Bent played the ball back into Charles N'Zogbia's path, the Frenchman was well off target from the edge of the penalty area.
James Henry was closer with the home side's first shot, his right-foot effort going not too far over.
But after Weimann's back-header from an N'Zogbia free-kick had been comfortably saved by David Forde, Villa were ahead in the 21st minute.
Weimann burst powerfully through the left channel before unleashing a tremendous drive which was too hot for Forde to handle.
Bent didn't make the best of contacts from the rebound but with Forde on the ground, the ball rolled over the line.
The goal came at a cost, however, Fabian Delph sustaining a painful blow on his ankle as he made the challenge which paved the way for Weimann's run - and the lead lasted only five minutes as Millwall hit back in determined fashion.
After Shay Given had saved from Liam Feeney and Shittu had headed over, the home skipper rose to meet Henry's corner from the right with a powerful close-range header which left Given helpless.
Given then had to make a decent save from Adam Smith's well-struck 25-yarder, although Villa opened the second half on the offensive, mounting a number of promising moves which lacked only a telling final ball.
The game was halted briefly when home supporters, aggrieved about a free-kick decision for a challenge on Weimann, started throwing bottles of water at the linesman.
Thankfully it proved to be an isolated incident but when the action resumed Given was required to save Henry's lob following a slip by Ciaran Clark.
At the other end, Forde also had to be alert, racing outside his area to clear from Bent as the striker chased N'Zogbia's long pass.
And the home keeper did even better when he managed to palm away a 30-yard drive from sub Barry Bannan after Bent's headed pass had created the opening.
Bent tested Forde again with a firm header from Lichaj's right-wing cross but in the 89th minute the Londoners cashed in on one of the few chances that had come their way.
Henry crossed from the right, and although Marquis hit the bar with his header, he nodded home at the second attempt.
Millwall: Forde; A Smith, Osborne, Shittu, Beevers; Henry, Abdou, Trotter, Feeney; Marquis (J Smith 90), Keogh (N'Guessan 82). Unused subs: Taylor, Dunne, Wright, Batt, Wilkinson.
Villa: Given; Lichaj, Lowton, Vlaar, Clark; Lichaj, Westwood,N'Zogbia, Delph (Bannan 39), Bennett;Weimann (Bowery 81), Bent. Unused subs: Guzan, Ireland, Agbonlahor, Holman, Williams.