Hunting an 11th straight home league victory, Unai Emery's side looked to have shrugged off a poor opening 45 minutes when Mesut Ozil cancelled out Christian Benteke's opener early in the second half.
But Arsenal's suspect defence came back to haunt it when Shkodran Mustafi and Bernd Leno failed to deal with a hopeful punt from deep, Wilfried Zaha latching on to Benteke's knockdown to restore Palace's lead.
Palace added further gloss to a fine performance soon after, James McArthur taking advantage of more slack defending to head in, with Pierre-Emerick Aubameyang's strike a mere consolation.
Despite a bright start from the Gunners in which Ozil and Matteo Guendouzi wasted decent opportunities, the visitors were ahead in the 17th minute.
Having allowed Scott Dann a free header five minutes prior, Arsenal's defence was found wanting once again when Benteke nodded in unmarked from Luka Milivojevic's free-kick.
Aaron Wan-Bissaka was then fortunate when referee Jonathan Moss deemed that he had not handled Sead Kolasinac's cross in Palace's area.
Alex Iwobi was introduced at half-time and Emery's decisiveness swiftly paid dividends as the substitute combined with Alexandre Lacazette to play in Ozil, who lifted a cute finish over Vicente Guaita from a tight angle.
Guaita had to be at his best just before the hour, diving to his right to keep out Kolasinac's stinging effort, but for all Arsenal's pressure, Palace moved back ahead when Benteke got the better of Mustafi, Zaha making no mistake after beating Leno to his strike-partner's flick-on.
McArthur made matters worse eight minutes later, heading in unchecked from a corner, and although Aubameyang cut the deficit soon after, Arsenal ultimately slipped to its first home league defeat since August.