Group entries by category than by month based on Date/Time field
In your code, within the {% for eventDate, entries in eventEntries | group("dayStart|date('F Y')") %} loop, in the sub-loop, you are looping over eventEntries.relatedTo(category).find() rather than restricting the entries in that loop to the ones you have already grouped to the date, i.e. in the entries array. That is why you are getting all the entries related to the category under each date heading, instead of just the ones falling under that date.

This should work:

{% set eventCategories = craft.categories.group('events').find() %}
{% set eventEntries = craft.entries.section('event').order('dayStart asc').limit(null) %}
{% for category in eventCategories %}
    &lt;h1&gt;{{ category.title }}&lt;/h1&gt;
        {% for eventDate, entries in eventEntries | group("dayStart|date('F Y')") %}
            &lt;h2&gt;{{ eventDate }}&lt;/h2&gt;
            &lt;ul&gt;
                {% for entry in entries if (category.id in entry.categoriesField.ids()) %}
                    &lt;li&gt;{{ entry.title }}&lt;/li&gt;
                {% endfor %}
            &lt;/ul&gt;
        {% endfor %}
{% endfor %}