Just a quick update, I decided to compromise slightly and opted for the following routes;
Route::get('categories', 'Controllers\Frontend\EventcategoriesController@index')->name('eventcategories.index');
Route::get('categories/{eventcategories}/event/{event}', 'Controllers\Frontend\EventsController@show')->where('eventcategories', '.*')->name('events.show');
Route::get('categories/{eventcategories}', 'Controllers\Frontend\EventcategoriesController@show')->where('eventcategories', '.*')->name('eventcategories.show');
It's important to have the more specific routes first before the more generic 'catch-all' route at the bottom. I can then explode the categories in the controller and perform any logic required to verify the URl structure is correct. IE the sub category belongs to the parent category etc.