objetos (equivalente aos dicts do python, por exemplo), funções, arrays e o null. Tudo mais NÃO É considerado um objeto pela linguagem.
Hmm, será?
Na especificação da linguagem tem uma seção chamada "Fundamental Objects" que possui 5 sub-seções:
- Object Objects
- Function Objects
- Boolean Objects
- Symbol Objects
- Error Objects
Os dois primeiros são os que vc já citou (objetos e funções), mas depois temos booleanos, símbolos e erros (exceções, como ReferenceError, etc).
E depois tem outras seções que tratam de tipos diferentes, mas que também são chamados de "objetos":
- Number Objects
- BigInt Objects
- The Math Object
- Date Objects
- String Objects
- RegExp (Regular Expression) Objects
Sem contar o Array, Map, Set, JSON, etc, todos esses são chamados de "Objects" pela especificação.
Só pra citar um exemplo, tanto /a/ instanceof Object quanto [] instanceof Object retornam true (a regex e o array são subtipos de Object).
No caso de números e strings é um pouco mais confuso: new String('a') instanceof Object é true mas 'a' instanceof Object é false. Isso é porque existem os tipos primitivos (string, números, etc), que não possuem métodos, mas quando vc tenta usar algum método (como 'abc'.includes('a')) é feito um auto-boxing automático para a classe wrapper equivalente (mais detalhes aqui).
De qualquer forma, veja que existem vários tipos que são sub-tipos de Object, e não se restringem aos que vc citou...
Inclusive, dá para definir propriedades em uma string, mas temos que usar o wrapper:
var x = new String('abc');
x.prop = 'oi';
console.log(x.prop); // oi
Se fizermos x = 'abc' aí não funciona porque estamos usando o primitivo, e para definição de propriedades não é feito o auto-boxing. Mas enfim, String é um objeto também. E o mesmo vale para Number, Boolean, etc.