Optimize finding events with overbooked attendees
The query itself looks pretty much the way to do it. As for indexing strategies I suggest that you drop indexes:

KEY `start_datetime_idx` (`start_datetime`) -- covered by start_end_datetime_idx

KEY `IDX_E8625CBD71F7E88B` (`event_id`) -- covered by PRIMARY


and replace:

KEY `IDX_E8625CBDA76ED395` (`user_id`),


with:

KEY `IDX_E8625CBDA76ED395` (`user_id`, event_id)