After Roelof van der Merwe had notched up his third century in six games this season to guide the Titans to 448 all out, Mbhalati took 6 for 33 in 10 overs as the Warriors were rolled inside 44 overs.
The Titans duly imposed the follow-on, and the Warriors reached nine without loss before bad light brought the day to a premature close, meaning the hosts will resume on day three still trailing by 291 runs.
Such a commanding position was largely set up by Van der Merwe and David Wiese (81), who extended their partnership for the sixth wicket to 138 after the Titans resumed on 337 for five, before the latter fell to Sisanda Magala in the eighth over of the day.
After Magala picked up Van der Merwe for 100 in his next over, Mangaliso Mosehle and Shaun von Berg contributed 39 apiece to see the Titans to a formidable total.
Playing just his fourth franchise game since November, Mbhalati then rammed home the Titans’ advantage as he got rid of both Michael Price and Jon-Jon Smuts in his fourth over.
A 53-run partnership between David White (32) and Ryan Bailey (26) appeared to have the Warriors back on track, but once Van der Merwe dismissed White, Mbhalati smashed through the middle order, ripping out four wickets in three overs as the hosts lost a total of five wickets for nine runs.
Simon Harmer did his best to extend the innings as he batted cleverly with the tail, but his 44 not out could only repair a small part of the damage.
Mbhalati’s five-wicket haul was his 10th in first-class cricket, and he will be eyeing another clutch of wickets when the Warriors return to the crease on the third morning.