Quoted and self-evaluating constants are immutable. That is, programs should not alter a constant via set-car!, string-set!, etc., and implementations are permitted to raise an exception with condition type &assertion if such an alteration is attempted. If an attempt to alter an immutable object is undetected, the behavior of the program is unspecified. An implementation may choose to share storage among different constants to save space.
The optimizer assumes it's a constant, and in this case determines that it is comparing two constant vectors and pre-computes the result:
> (expand/optimize '(equal? (let ((v '#(1 2 3))) (vector-set! v 1 100) v) '#(1 100 3)))
(begin (#2%vector-set! '#(1 2 3) 1 100) #f)
All vectors are mutable by default, including constants. A program can create immutable vectors via vector->immutable-vector. Any attempt to modify an immutable vector causes an exception to be raised.
This is talking about immutable vectors, which is a distinct concept (introduced much more recently), and not related to the immutability described in the documentation for quote. It would be more accurate to say that while constant vectors can be mutated they should not be, and that it may have unexpected results. I'd say it's a bug in the documentation that these two concepts are not more clearly distinguished.
An alternative approach would be to make quoted vector constants immutable (as if with vector->immutable-vector), but that is a backwards incompatible change (and we tend to avoid those).
Hope this clears things up.
Jamie