Here's my solution
The CrossTab tool was key here, it allowed me to group by the ticket ID and then identify combos. Its output is a bit messy and I'm sure there's a better way to spread the Type column, but by checking for empty strings I was able to determine if a ticket had purchased an item or not.
I assumed that salad and soups aren't sides, but the workflow should still work if you add additional arguments to the MultiField Expression tool.
Enjoyed the exercise, thanks!