Вот краткий пересказ своими словами из спецификации ECMAScript 2020 о том, как работают логические операторы.
ToBoolean ( 
аргумент )
Абстрактная операция ToBoolean принимает 
аргумент. Она преобразует 
аргумент в значение типа Boolean согласно следующей таблице:
	
	| 
		 Код: 
	 | 
	┌───────────────┬──────────────────────────────────────────────┐
│ Тип аргумента │                   Результат                  │
├───────────────┼──────────────────────────────────────────────┤
│   Undefined   │ возвратить false                             │
├───────────────┼──────────────────────────────────────────────┤
│     Null      │ возвратить false                             │
├───────────────┼──────────────────────────────────────────────┤
│    Boolean    │ возвратить аргумент                          │
├───────────────┼──────────────────────────────────────────────┤
│    Number     │ если аргумент равен +0, -0 или NaN,          │
│               │ то возвратить false, иначе возвратить true   │
├───────────────┼──────────────────────────────────────────────┤
│    String     │ если аргумент является пустой строкой        │
│               │ (её длина равна нулю), то возвратить false,  │
│               │ иначе возвратить true                        │
├───────────────┼──────────────────────────────────────────────┤
│    Symbol     │ возвратить true                              │
├───────────────┼──────────────────────────────────────────────┤
│    BigInt     │ если аргумент равен 0n, то возвратить false, │
│               │ иначе возвратить true                        │
├───────────────┼──────────────────────────────────────────────┤
│    Object     │ возвратить true                              │
└───────────────┴──────────────────────────────────────────────┘  | 
	
Когда вычисляется 
A && B, то происходит следующее...
-  Если ToBoolean( A ) возвращает false, то вернуть A
 
-  иначе вернуть B
 
Когда вычисляется 
A || B, то происходит следующее...
-  Если ToBoolean( A ) возвращает true, то вернуть A
 
-  иначе вернуть B