Olá, Felipe, como vai?
A sua lógica está coerente para criar uma matriz 3x3 com valores sequenciais de 1 a 9. Você inicia com um array vazio, utiliza um contador externo para controlar a sequência dos números e, a cada iteração do laço interno, incrementa esse valor e adiciona ao array de linhas. Ao final de cada ciclo do laço externo, você adiciona a linha completa à matriz principal. O resultado final será uma estrutura como [[1,2,3],[4,5,6],[7,8,9]], o que atende ao enunciado.
Um ponto de atenção é que você reutilizou o nome da variável i nos dois for. Embora funcione por conta do escopo de bloco com let, não é uma boa prática manter o mesmo identificador em laços aninhados. Poderia usar, por exemplo, i para o laço externo e j para o interno, o que deixa o código mais legível.
Sobre imprimir sem precisar de um for apenas para organizar em linhas e colunas, há algumas alternativas. Uma delas é utilizar console.table(matriz), que já exibe a matriz de forma tabular no console, facilitando a visualização. Outra possibilidade é usar console.log(matriz.map(linha => linha.join(' ')).join('\n')). Nesse caso, cada linha é transformada em uma string separada por espaço e depois todas são unidas com quebra de linha, resultando na impressão em formato de grade sem a necessidade de um segundo laço explícito.
Espero ter ajudado.
Siga firme nos seus estudos e conte com o fórum sempre que precisar.
Abraços :)
Caso este post tenha lhe ajudado, por favor, marcar como solucionado