Arsenal suffered only their second defeat of the Premier League season and lost their hold on top spot after defeat at Villa Park.
Villa had beaten defending champions Manchester City in midweek, while Declan Rice's 97th-minute header had secured a 4-3 victory for the Gunners at Luton.
And Mikel Arteta - serving a one-game touchline ban - made just one change to his starting line-up, with Oleksandr ZInchenko coming in for Jakub Kiwior, as his side looked to regain top spot from Liverpool after their lunchtime win at Crystal Palace.
The hosts enjoyed some good possession in the opening minutes, before Bukayo Saka switched play out to Gabriel Martinelli on the left and tried to connect with the Brazilian's deep cross, but was unable to take a difficult chance in the sixth minute.
Villa took the lead a minute later, though, as they attacked on the right and Leon Bailey found captain John McGinn to convert with a shot on the turn in front of the Holte End.
Since suffering a 4-2 home loss to Arsenal in February 2023, Unai Emery's Villa had won 18 times and drawn twice when taking the lead, highlighting the size of the challenge now facing Arteta's men.
And Saka had a shot blocked after a good burst from midfield and pass from Kai Havertz in the 16th minute, before another opportunity soon after was snuffed out by Villa's aggressive press.
Havertz conceded a free-kick for a pull on Youri Tielemans, about 25 yards out and to the right of the D, but Arsenal's defensive wall did its job in blocking Lucas Digne's effort and Douglas Luiz saw his follow-up attempt foiled.
Zinchenko was shown the first yellow card of the night for pulling the shirt of a turning Tielemans, with Saka forcing a save from former teammate Emi Martinez in the 32nd minute.
And Martin Odegaard sent a low drive into the side netting after Ben White had done well to collect Saka's pass just inside the byline to help set up the chance for the captain.
Martinelli latched onto a long pass on the left on 36 minutes and lobbed the onrushing Martinelli, only for Diego Carlos to clear the ball as it bounced inside the six-yard box.
But the visitors were growing to their task and Odegaard saw another effort saved by Martinez after Gabriel Jesus had teed up a cross from Havertz for the Norwegian.
David Raya saved well from Ollie Watkins at the other end, before a flag went up to signal the England striker had been offside.
Gabriel Jesus was next to test Martinez with an angled shot from the left three minutes before the break, before William Saliba's uncharacteristically loose pass gifted Villa a corner in stoppage time, which thankfully came to nothing.
But Arsenal's claims for a penalty soon after the restart, when Gabriel Jesus went down in the box, also proved fruitless to the delight of the home fans.
Digne was booked for grabbing Saka as he looked to enter the box on the right, but the visitors could not capitalise from the free-kick.
However, they went very close to levelling when Martinez pushed Saka's inswinging corner onto the back of teammate Watkins and saw the ball hit the near post before Carlos cleared the danger.
Odegaard steered a shot wide after Havertz ran onto Zinchenko's pass over the top of Villa's defence and squared from the left just before the hour, as the Gunners continued to probe for an equaliser.
But Villa created a good chance for Digne to test Raya, before Saka ran onto a pass from Rice and beat Martinelli to find the vacant net, only for a late offside flag to cut short his celebrations.
And Saka was then left clutching his ankle having been on the receiving end of a robust challenge from Douglas Luiz, who was booked.
Watkins forced a sharp save from Raya midway through the second half, before Odegaard was bundled over a few yards outside the box.
Martinelli made way for Leandro Trossard in Arsenal's first change of the night before the free-kick could be taken, with Rice seeing his effort hit the new arrival and roll harmlessly through to Martinez.
And McGinn was the next Villa player to have his name taken after a foul on opposite number Odegaard inside the Arsenal half.
Rice was cautioned for catching Matty Cash late in midfield as the visitors remained frustrated, with Alex Moreno producing a timely intervention to thwart Gabriel Jesus as space looked to be opening up for the Brazilian striker, before he made way for Eddie Nketiah.
And the young striker was caught off the ball by a stray arm from Carlos, who also had his name taken by referee Jarred Gillett.
Arsenal had the ball in the net in the last minute of normal time when Odegaard's deep cross bounced off Havertz as he competed with Cash and Nketiah poked home.
But after a lengthy VAR check, the on-field decision by Gillett to disallow the goal was upheld, after the ball was seen in replays to have hit the arm of Havertz.
Arsenal: Raya, White, Gabriel, Saliba, Zinchenko (Nelson 90), Odegaard, Rice, Havertz, Saka, Jesus (Nketiah 81), Martinelli (Trossard 70). Unused subs: Ramsdale, Kiwior, Cedric Soares, Jorginho, Elneny, Walters.
Comments: Our rules
We want our comments to be a lively and valuable part of our community - a place where readers can debate and engage with the most important local issues. The ability to comment on our stories is a privilege, not a right, however, and that privilege may be withdrawn if it is abused or misused.
Please report any comments that break our rules.
Read the rules here