Assuming it's the Atomic* classes from java.util.concurrent.atomic package.
You are talking about two different concepts: the reference to the atomic object and the atomic object itself.
True, CAS on the same atomic integer object is atomic. But how can we be sure that the compareAndSet method calls in two threads are applied to the same object? Just like any java object that are shared by multiple threads, this is related to the safe-publication of the [atomic] object.
This is where volatile, final member variables or locking comes in useful. The reference to the object should be properly shared by multiple threads.
After rereading the question, I see you could be asking why the value member in AtomicInteger is declared volatile. For starters, not all methods are based on unsafe.compareAndSwapInt, there are simple set and get that directly access the value field, this is enough reason for this field to be volatile. I wonder it's also required for the unsafe operations.