Villa kept coming and Jacob Ramsey was narrowly off-target with a curler after surging into the United area.
McGinn nearly caught out Onana with a clever free-kick that had the United keeper scrambling to save at his near post.
United were unbeaten in their last 141 Premier League matches when leading at half-time dating back to 2014.
Victor Lindelof replaced Luke Shaw at left-back for United at the interval and Villa immediately attacked the out of position Swede.
Onana kept United ahead with an instinctive save to repel Watkins’ close-range shot from Matty Cash’s low cross.
Ramsey’s poor touch allowed a golden opportunity for a Villa equaliser to go begging after Leon Bailey’s pass split the United defence.
Fernandes should have done better than smash wildly over from Garnacho’s cutback.
It proved a crucial miss as Villa deservedly equalised in the 67th minute.
United failed to deal with a corner and when Onana saved Clement Lenglet’s close range flick, Raphael Varane could only scuff the ball towards Bailey.
The Villa forward picked out a perfect pass to Luiz and the Brazilian fired home from five yards before celebrating in flamboyant fashion in front of Onana.
Garnacho almost restored United’s lead with a superb run and strike, but Martinez saved at full stretch.
Onana got a measure of revenge for Luiz’s provocative celebration when he saved the midfielder’s scuffed effort.
And United snatched three priceless points in the 86th minute as McTominay rose highest to meet Diogo Dalot’s cross with a thunderous header that flashed past Martinez.