В чём разница между reselect и хуками useCallback и useMemo?
Это очень разные вещи:

1. useCallback - мемоизирует саму функцию, а не ее результат
2. useMemo - мемоизирует результат функции
3. Reselect - это вообще редаксовская штука, мемоизирует результаты селектора, и выстраивает зависимости одного от другого, если результат зависимого селектора не обновился - реселект не будет пересчитывать селектор. кароче говоря оптимизация.
Reselect логично использовать для глобальной мемоизации - когда одно и тоже мемоизированное значение нужно использовать в разных компонентах(контейнерах) программы. Поэтому реселект используют совместно с редаксом, т.к. редакс - это состояние всего приложения.

useMemo и useCallback - есть смысл использовать для мемоизации данных которые вычисляются для одного конкретного компонента (или его детей) и нигде больше не нужны.