1. push мутирует массив. Читаем
это и никогда не мутируем state. На ES6 добавить элемент в массив можно так:
this.setState({ massiv: [ ...this.state.massiv, "новый элемент" ] })
2. Данные компоненты должны получать только через props. Конечно, некоторые из компонентов у вас будут как controller-view (подключены к store и будут получать данные через события\конекст\еще как-нибудь), но таких контроллеров должно быть мало, реально мало - в основном на верхних уровнях дерева.
3. По поводу ajaxa - выносите такую логику в бизнес-слой. В ваши action creators, например. Тогда у вас не возникнет таких проблем: делаете запрос -> когда он завершится отправляете соответствующий action (success, failure) -> store обрабатывает экшен, изменяет свое состояние -> controller view получает новые данные и рендерится
4. В ES6 есть промисы
const someArr = [];
const doAjaxJob = el => fetch('some-url', .... );
const p = Promise.all(someArr.map(doAjaxJob)); // <-- сюда можно подписаться
PS И главное - не превращайте хороший функциональный стиль в спагетти