Нужно ли включать маршрутизатор в изоморфную часть?
С дублированием сложно смириться морально. Но есть три пути, два Вы описали, дублировать и изоморфить. Но мне больше по душе третий, когда серверная часть содержит все в себе, обобщенную решаемую задачу и динамически порождает клиентскую часть. То есть, нужно не 2 раза писать, а используя метапрограммирование подняться на такой слой абстракции, где нет клиента и сервера и там решать задачу, а потом транслировать ее в клиент и сервер, в шаблоны и маршруты в конкретику.
Прошу прощения, но я не понимаю, о каких проблемах с получением данных Вы говорите в первом варианте. Выглядит всё не так страшно: каждый React класс может иметь статические методы, в которые вы можете вынести вызов функций, которые сделают fetch ваших данных. Вы можете посмотреть как я это сделал у себя в коде.
И вот по поводу 404.