O código acima imprimirá "diferente" afinal as variáveis letra e outraLetra referenciam objetos String diferentes na memória. Existem de fato dois objetos diferentes criados.
O código acima imprimirá "igual" mesmo utilizando o operador ==. Pq? Porque em Strings (apenas em Strings) quando você cria um objeto sem o operador new, o Java coloca o conteúdo desse objeto num POOL e o vincula ao objeto. Quando você criar uma outra String também sem o operador new, ele procurará no pool um conteúdo igual, caso ele ache ele vincula esse mesmo objeto à nova variável de instância. Assim sendo no código acima existe apenas um objeto na memória, referenciado por duas variáveis: letra e outraLetra.
Mesmo assim, o uso do == não é recomendado para Strings. Utilize .equals para comparação de conteúdos em Strings.