Since the scope of your binding in your controller is the registrant you don't need to prefix the events elements with registrant. Remove that from your tags and binding will work.
<table>
<thead>
<tr>
<th>Title</th>
<th># of Tickets</th>
</tr>
</thead>
<tbody>
<g:each var="event" in="${Event.list()}" status="s">
<tr>
<td>${event.title}</td>
<td><g:field type="text" name="events[${s}].numberOfTickets"/>
<g:field type="hidden" name="events[${s}].event.id" value="${event?.id}"/></td>
</tr>
</g:each>
</tbody>
</table>