The reason code breaks for regular objects is because helper may not be null, but point to an object that has not yet been fully initialized, as described in your quote.
However, if the Helper class is immutable, which means that all its fields are final, the Java memory model ensures that they are safely published, even if the object is accessible through a data race (which is the case in your example):
Fieldsfinal also allows programmers to implement thread-safe immutable objects without synchronization. A thread-safe immutable object is considered immutable for all threads, even if the data race is used to pass references to an immutable object between threads . This can provide security guarantees against misuse of an immutable class with incorrect or malicious code. The final fields must be used correctly to guarantee a guarantee of immutability.
source share