Modifying an element of the List does not in any way alter the internal state of the List object. In other words, the code cannot corrupt the List object itself so locking isn't necessary for that.
However, it is entirely unpredictable when another thread that iterates the List is going to be able to observe the changed element. With very good odds that it will see a stale or partially updated value of the list element. The element type matters a great deal, it needs to be atomic to avoid the case where another thread sees a partially updated value. Only value types of Integer or less and reference type references are guaranteed to be atomic. Both the staleness and the atomicity problems almost always require locking to avoid undebuggable and random failure.