Accessing a String value from multiple threads without synchronization
Your code is not synchronized at all at the moment.  There are two major mistakes:


You are only synchronizing in the thread(s) which are writing the value, but are never synchronizing on the threads reading the value.  You must always synchronized on all threads that read/write a value which is shared between thread.  Absolutely nothing is synchronized if you only synchronize on read or only on write.
You use synchronize(myValue), but you keep changing myValue, so you are synchronizing on different objects over time, which basically means no synchronization.


By the way, it is possible that you made some tests and everything seemed synchronized.  However, you should be aware that those tests would fail on other cpu's, or could fail on your machine if you tried them enough time.

More general comments:


Your whole class MetricsUpdater can be dropped for a volatile String myValueSynchronized.  Note however that this only work with references to immutable Objects (such as String), or raw types.
To answer your question "Does it even need to be synchronized at all if all of the other threads are only allowed to read it?"
NO!
You could forgo synchronization however if the value was final and unmodifiable.