A turgid first half was followed by a frantic second which delivered all six goals — Anthony Martial cancelled out Ollie Watkins’s opener within seconds, then Marcus Rashford struck after a Diogo Dalot own goal had put the visitors back in front.
Bruno Fernandes then fired United ahead in the 78th minute before Scott McTominay added a fourth in stoppage time, with both goals set up by teenager Alejandro Garnacho after he had come off the bench.
The result saw United exact some revenge for Sunday’s 3-1 Premier League defeat at Villa Park and send the Old Trafford faithful away happy in their final home game before the World Cup.
Both managers made seven changes from Sunday, with Harry Maguire taking the captain’s armband for United while there was a debut in goal for Martin Dubravka. Cristiano Ronaldo, the skipper on Sunday, was not in the squad due to illness.
Donny van de Beek made a third straight start, playing in a number 10 role with Fernandes shunted out wide, but hardly shone as neither side managed to mount any sustained pressure in a poor opening 45 minutes.
Villa could barely get out of their own half, United rarely managed to stay onside. Fernandes had the ball in the net in the 18th minute but the flag had long been up against Rashford as he set off too early to meet Fred’s through ball.
Neither side had a shot on target until stoppage time, when Fernandes tried to catch Robin Olsen out of position with a tame free-kick from deep.
But the match came to life after the break.
England World Cup salaries — in pictures
Villa struck first with Jacob Ramsey reprising his role as a creator from Sunday. As United appealed in vain for handball after Fred was dispossessed, Ramsey’s pass found the run of Watkins who got goalside of the defence to beat Dubravka.
Villa were still celebrating as United struck back seconds later. Fernandes beat the offside trap as he raced on to Dalot’s long pass, then rolled the ball over for Martial to finish with ease.
Emery changed shape with a triple substitution as Emi Buendia, Leon Bailey and Tyrone Mings were sent on and it quickly paid off as Bailey helped Villa retake the lead just after the hour.
Ashley Young’s cross found the Jamaican at the far post, and his header back across was inadvertently turned past Dubravka by the unfortunate Dalot.
Ten Hag responded with a triple substitution of his own and five minutes later, United were level.
Rashford flicked the ball on for one of the new faces, Christian Eriksen, and although Young slid in to nick the ball away, it rolled across the box for Rashford to pick up, staying on his feet under pressure from Mings before rifling past Olsen.
Garnacho’s introduction brought further excitement to Old Trafford as the 18-year-old showed no fear in running at defenders.
And when the Villa back four allowed his cross to reach Fernandes, Olsen did well to block his low shot before punching clear Maguire’s header from the resulting corner.
Fernandes flashed a shot wide as the pressure grew. Olsen responded by first spilling a cross, then mis-hitting a clearance straight to Garnacho.
The young player squared the ball to Fernandes who took a touch before hitting a shot which deflected off Mings on its way past the goalkeeper.
And Garnacho was the creator again in stoppage time, looping in a cross from the left which McTominay stretched to poke home at the far post.