У вас может быть больше успеха, если вы измените свой клиентский код для работы с массивом сеансов, каждый сеанс которого имеет своего спикера, это означает, что ваш исходный запрос будет выглядеть так:
$sessions = Sessions::with([
'speaker', 'audiancesession.audiances', 'subjectsession.subjects'
])->where('application_period_id', (int) ApplicationPeriod::orderBy('id','DESC')->first())->get();
Обратите внимание на порядок-> сначала в ApplicationPeriod
делает так, что вам не нужно получать все периоды применения из базы данных в память.
Тогда ваша клиентская сторона должна обрабатывать массив сессий.
Вы можете слегка преобразовать вышеупомянутое, используя, чтобы получить результат, аналогичный тому, что вам нужно:
$speakers = $sessions->map(function ($session) {
$speaker = collect($session->speaker->toArray());
$speaker->put('session', collect($session->toArray())->except('speaker'));
return $speaker;
})->orderBy('last_name','DESC');
Хотя я бы не стал гарантировать результат здесь, поскольку я не проверял его на ваших (сложных на вид) данных.