Как правильно использовать useSelector и store.getState?
В Redux Style Guide рекомендуют 2-й вариант
https://redux.js.org/style-guide/style-guide#call-...
Как правильно использовать useSelector
1. Компактнее, понятнее, всего 1 вызов.
2. В 2 раза больше кода чем в первом варианте.
3. Почти как первый, но данные сначала помещаются в массив, а потом деструктурируются. Ненужная операция исключительно ради того, чтоб везде были квадратные скобочки, вкусовщина.

Если остро стоит вопрос производительности вынуждающий экономить на операциях, то стоит посмотреть во что трансформируются варианты 1 и 2 для прода, и уже там подсчитывать операции.

Как правильно использовать store.getState
Это функция, которая вернет текущий стейт. Это не хук, поэтому компонент не будет реагировать на изменения стейта. ХУк сможешь использовать только в компонентах, а getState позволит получить данные вне компонентов.