Насколько известно предотвращение мутации входящих данных в reducer’ы - это как раз одна из причин почему делают копию state’a, насколько глубокую копию делать - зависит от данных которые нужно изменить. В случае если изменения вносятся в просто state, происходит и мутация входящих данных и connect не видит разницы между state’ом который пришёл в reducer и тем state’ом, который вышел в качестве результата, т.к. connect сравнивает объекты по ссылкам на эти объекты, а не по содержимым этих объектов , а ссылка остаётся такой же что и была раньше, поэтому connect не рендерит новый state