A win would have sent Pirates through to the semi-finals, but now they will have to wait until the next round of fixtures to be sure of qualification.
Zamalek came out all guns blazing, and put Pirates under pressure from the first minute of the match.
The Egyptians went 1-0 up on six minutes, when Lucky Lekgwathi had fouled Shikabala in the penalty area and the referee pointed to the spot.
Eid Abdel Malek stepped up to take the spot-kick and sent Senzo Meyiwa the wrong way to put the hosts ahead.
Bacela grabbed the equaliser just after the half-hour mark, after surging up the left wing, turning his defender and beating goalkeeper Abdul-Wahed Al-Sayed with a low shot.
Four minutes from half-time Bacela should have made it 2-1 to Bucs, but his shot was saved by Al-Sayed.
Early in the second half Meyiwa did well to punch a cross away and keep the score at 1-1, but a few minutes later he misread a corner-kick, and the ball reached an unmarked Salah Soliman at the far post, who headed home to give the hosts the lead again.
Meyiwa did well again on the hour mark, denying Ahmed Gaafar in a one-on-one situation, and a few minutes later he deflected a shot from Ahmed Gaafar.
Andile Jali was cautioned in the 65 minute, and will miss Bucs’ next CAF match.
12 minutes from time Zamalek had a penalty shout denied, after the ball hit Rooi Mahamutsa on the arm in the box.
Ndumiso Mabena, who was brought on for Bacela with 10 minutes to go, could have levelled the scores three minutes before full time, but Hamada Tolba got himself in the way of his shot.
The win is Zamalek’s first in the Champions League group stages.
Pirates remain top of Group B, equal on seven points with Al-Ahly, but ahead on a goal difference of +5 to Ahly’s -1.
AC Leopards and Zamalek are third and fourth, respectively, with four points each.
Orlando Pirates next travel to AC Leopards on September 15, while Al-Ahly will host Zamalek on September 22.