Villa suffered their first Barclays Premier League defeat at Goodison Park for nearly eight years as two late goals earned three points for the Toffees.
After the thrilling midweek derby victory over Albion, Paul Lambert's men were beaten here, despite taking a 34th-minute lead through Leandro Bacuna, who calmly collected his fourth goal of the season.
The visitors were pinned back in their own half for most of the second half, conceding a 73rd-minute equaliser from sub Steven Naismith before Kevin Mirallas hit the winner from a free-kick five minutes from the end.
To add to Villa's woes, skipper Ron Vlaar went off injured in the 80th minute.
There was an early let-off for the visitors when Aiden McGeady cut inside from the right and curled a left-footer against the far post, with Brad Guzan beaten.
But both sides struggled to find any fluency in the opening stages, and Guzan certainly had no difficulty in holding Everton's next effort, a tame Kevin Mirallas shot from outside the penalty area.
Villa were certainly finding the going tough on the greasy surface, despite a couple of promising passes from Grant Holt and Andi Weimann, which Christian Benteke was unable to capitalise upon.
McGeady again cut in from the left in the 27th minute, but this time his low drive was comfortably held by Guzan.
But after Vlaar had ventured forward to make a block challenge that sent the ball over the bar, Villa were ahead with their first attempt on target.
Fabian Delph's tenacity saw him dispossess Ross Barkley on the half-way line and Bacuna quickly played the ball forward to Benteke.
The Dutch wing-back continued his run and accepted Benteke's return pass to send a low angled shot beyond Tim Howard and into the far corner.
The Merseysiders responded with a Mirallas drive which was blocked by Ciaran Clark for a corner, although Villa saw out the remainder of the first half with no further threat from the home side.
Mirallas broke clear down the right in the 50th minute but Bacuna was well positioned to intercept the striker's low cross, but there was relief nine minutes later when Leon Osman capitalised on a rare Ashley Westwood mistake to send a low left-foot drive just wide of the far post.
Osman then tried a low shot on the turn which Guzan dealt with competently, while Bertrand was happy to concede a corner when Mirallas cut the ball back menacingly following Osman's astute pass.
The Toffees were enjoying a high percentage of possession, with Guzan again called into action when he held a stinging drive from sub Steven Pienaar, who had replaced Barkley at the interval.
And Benteke almost conceded a painful own goal when a fiercely driven cross from Leighton Baines struck him in the face and flew just wide.
But in the 73rd minute, the home side were deservedly level, Naismith slotting alow shot past Guzan from 12 yards after Pienaar's clever flick-on from a Gareth Barry pass.
After Vlaar had been replaced by Marc Albrighton, Villa managed their first shot of the second half in the 84th minute, although Weimann's effort was much too high.
A minute late Everton were in front, Mirallas delivering a stunning 25-yard free-kick past Guzan's despairing reach and into the corner of the net.
It could have been worse, too, Guzan doing well to palm out Naismith's 89th-minute header from close range, although Albrighton was close to an equaliser with a stoppage-time drive that deflected just over.
Everton: Howard; Stones (Naismith 69), Jagielka, Distin, Baines; McGeady (Hibbert 87), Barkley (Pienaar HT), Barry, McCarthy, Osman; Mirallas. Unused subs: Robles, Coleman, Vellios, Garbutt.
Villa: Guzan; Bacuna, Vlaar (Albrighton 80), Clark, Baker, Bertrand; Westwood, Delph; Weimann (Tonev 87); Holt (El Ahmadi 61), Benteke. Unused subs: Steer, Helenis, Sylla, Lowton.