"shallow" copy, rispetto al "deep" copy, vuol solo dire in generale che data una struttura dati che viene "clonata", NON tutto viene completamente duplicato e resto distinto. Cioè certe cose restano ancora comuni e condivise tra la struttura originale e quella "clonata".
Le collezioni Java sono clonabili (hanno il metodo clone pubblico) ma fanno solo una shallow copy. Il clone() di ArrayList restituisce un NUOVO oggetto ArrayList ma i reference contenuti sono esattamente gli stessi (proprio in termini di == ) contenuti nel ArrayList originale.
Questo vuol dire che nel nuovo ArrayList puoi aggiungere, rimuovere, spostare i reference come vuoi e questo non cambia nulla nel ArrayList originale, perché la struttura dati in sé è distinta. Ma non gli oggetti! Se un oggetto contenuto fosse "mutabile", la modifica all'oggetto la "vedi" attraverso entrambi gli ArrayList, perché hanno lo stesso reference al medesimo oggetto mutato.
A parte il fatto che con ArrayList, non puoi certo indirizzare con [i], perché non è un array.
Ma il succo/concetto comunque è proprio quello: un for e poi "per ciascun elemento" prendi il valore, moltiplichi per X e risetti il nuovo valore (o meglio inserisci in un nuovo ArrayList).
Se vuoi lasciare intatto il ArrayList originale ed anche abbreviare il tutto, da Java 8 usi la Stream API e una lambda expression.