Зачем передавать event в компонент Vue?
зачем передавать: @my-event="myEvent" ?
Правильнее говорить не "передавать", а "назначать обработчик события". Чисто технически - да, происходит передача функции в экземпляр компонента. Но поскольку способ передачи указывает на специфический способ использования этой функции, давайте будем придерживаться соответствующей терминологии.

Итак, зачем назначать обработчик события? Вообще - это вам виднее, надо или не надо обрабатывать событие, и если надо, то как именно. А в данном конкретном случае - чтобы обновить значение свойства родительского компонента, отвечающего за состояние диалогового окна.

Кстати,в явном виде делать это совсем не обязательно.
Первый вариант - можно использовать модификатор sync при привязке значения параметра aa:

<modal-notifications :aa.sync="isActive" :message="message"></modal-notifications>
Метод закрытия в компоненте окна в этом случае станет выглядеть так:

closeModalWindow() {
  this.$emit('update:aa', false);
},
Второй вариант - управлять состоянием окна посредством директивы v-model. Надо будет заменить имя параметра с aa на value (ну или настроить model):

props: ['aa', 'message'], ---> props: [ 'value', 'message' ],
:class="{'is-active': aa}" ---> :class="{ 'is-active': value }"

Переписать метод закрытия окна:

closeModalWindow() {
  this.$emit('input', false);
},
Ну а в родительском компоненте станет так:

<modal-notifications v-model="isActive" :message="message"></modal-notifications>


Я же делаю из потомка this.$emit('my-event', this.isActive) которое слушает родитель.
Никто ничего просто так не "слушает". Чтобы "слушать", надо назначить обработчик соответствующего события. Что и происходит посредством @my-event="myEvent".

эмит выше вроде бы не нужен, но без него не работает
Чё? Какой ещё "эмит"? Нет "выше" никакого "эмита". Вы в родителе событие обрабатываете, а не порождаете.

И еще вопрос. Что делает:
myEvent: function(isActive) {
  this.isActive = isActive
}
Почему оно должно что-то принимать? Можно же просто значение из data взять.
"Значение из data" брать бессмысленно - это и есть this.isActive. Который вам обновить надо. Обновить значением, которое присылает диалоговое окно. Значением, которое передаётся в (т.е., которое принимает) обработчик события.
Но зачем передавать: @my-event="myEvent" ? 
ты как бы говоришь "слушаю событие my-event и если оно случится (вызывая $emit снизу), то нужно запустить обработчик-функцию myEvent"
родитель не знает всех событий и просто таким образом мы говорим ему