Quando você cria Strings com “”, a máquina virtual verifica se essa String já existe num pool de Strings que ela tem; caso exista, é retornada a mesma referência da String existente, por isso o == dá certo; caso não exista, é criada uma nova String, colocada no pool e depois retornada pra quem chamou.
Caso você queira mesmo que duas Strings “iguais” sejam de referências diferentes, é só você obter a String de outra maneira, sem ser com “”:
String s1 "MyString";
String s2 = new String("MyString");
Isso é um exemplo, existem várias outras formas de você obter uma nova String diferente.