Villa went in front when Watkins took advantage of Marc Cucurella’s poor defending to lob Kepa Arrizabalaga (18) – but the visitors were indebted to goalkeeper Emiliano Martinez, who pulled off a string of superb saves to keep his side ahead.
The Argentine World Cup winner made two smart one-on-one stops to deny Mykhailo Mudryk, as well as Kai Havertz on several occasions.
Chelsea saw a Ben Chilwell header ruled out for a push by the full-back on Ashley Young before half-time – and the Blues received a sucker punch after the interval as McGinn’s long-range stunner from distance found the bottom corner.
The result moves Chelsea down to 11th in the table – 11 points off fourth and nine behind fifth-placed Newcastle having played two games more.
Villa, meanwhile, climb to ninth with defeats for Liverpool and Fulham earlier on Saturday, as well as Brighton and Brentford’s draw, meaning Unai Emery’s side are now just two points off sixth.
This match was the first of nine matches for Chelsea in April. Attention now turns to a midweek Premier League clash at home to Liverpool on Tuesday night, live on Sky Sports, kick-off 8pm.
Next weekend sees the Blues take on Wolves away from home, with bumper fixtures against Real Madrid – twice – Brighton, Manchester United, Brentford and Arsenal to complete a busy month.
Aston Villa, meanwhile, now turn their attention to two Midlands derbies. The first is on Tuesday night away at Leicester, before hosting Nottingham Forest next Saturday.