Где и как нужно сделать AJAX запрос в redux?
Для работы с promise Вам нужно использовать дополнительный middleware - promise middleware. Существует несколько реализаций - можете выбрать любой понравившийся. Я использую этот и относительно него буду далее писать.Как я понял, запрос пишется в action creator при помощи промиса
Да, все так. В экшен-креаторе делаем запрос, возвращаем экшен с промисом. Далее promiseMiddleware подхватывает его и вместо одного экшена диспатчит 3 - действие началось, действие завершилось успешно, действие завершилось с ошибкой. Все это происходит в зависимости от того в какое состояние попал вышеупомянутый promise. Другими словами - "действие началось" диспатчится сразу; если запрос успешен - диспатчится "действие завершилось успешно". 
Соответственно в вашем редьюсере Вы подписываетесь на это три действия. Пример:// action creator
import fetch from 'isomorphic-fetch';

export default function getBook() {
  // Для запросов чаще всего используется  isomorphic-fetch, который возвращает promise
  const promise = fetch(url, options);
  return {
    types:  [ 'GET_BOOK-BEGIN', 'GET_BOOK-SUCCESS', 'GET_BOOK-FAILURE' ],
    promise,
  };
}// reducer
import {GET_BOOK} from '../actions/books';

const booksReducer = (state = {}, action) => {
  switch (action.type) {
    case 'GET_BOOK-SUCCESS':
      // При успешном завершении у нас установлено свойство result с ответом сервера
      return action.result;
    case 'GET_BOOK-FAILURE':
      // При неудачном завершении у нас установлено свойство error с описанием ошибки
      doSomethingWithError(action.error); // <--- просто для примера
    default:
      return state;
  }
};

export default booksReducer;UPD1 К слову: у редакса есть отличный пример, где все это можно в живую посмотреть - https://github.com/rackt/redux/tree/master/example...
Как было уже написано, да нужно использовать thunk-middleware, код которого кстати, очень простой!
Суть в том, что нужно проверить: если ваш action возвращает функцию - значит прокинь в него dispatch и getState и жди что будет дальше, а если ваш action - простой объект (как и задумывалось) - сразу прокинь его дальше. Так и работают middleware - добавляя функционал и пробрасывая выполнение дальше.
У меня есть подробное руководство по redux на русском, посмотрите здесь - https://www.gitbook.com/book/maxfarseer/redux-cour...
Спасибо.