1) zbog optimizacije brzine i memorije, jer ako se zna da je "aaaa" uvek te vrednosti JVM će svaku pojavu tog literala vezati za isti objekat, neće se praviti novi osim ako se baše ne iskoristi new String("aaaa"). Isprobaj ovo, napravi više stringova pa ih poredi sa == dobićeš true osim ako ne koristiš operator new.
2) zbog enkapsulacije, kad getter metoda vrati referencu tipa String, preko te reference se ne može menjati unutrašnje stanje objekta, mora se pozvati setter.
Sigurno ima još razloga...
Bolje džaba ležat nego džaba radit.