Ну как я понял - каждый раз после диспатча экшена будет вызываться useSelector и возвращать новый объект, следовательно постоянно будет ререндер, а если через useSelector возвращать простые типы, то они будут сравниваться по значению и если они не поменялись, то ререндера не будет. Если надо возвращать сложный тип из useSelector, то надо юзать reselect, т.к. он позволяет создать мемоизированный селектор, у которого уже не будет проблем со сравниванием двух одинаковых объектов находящихся в разных участках памяти.
Слишком сложно, досвидания