It doesn't seem Racket vectors have an analogous feature. I also don't know to build my own without rewriting most of the vector API. I read through the Racket Reference on the racket/generics module, the object system, and structure properties, but none of them are fit for introducing an abstraction over existing vectors.
Maybe a structure that wraps a vector and dereferences to it when passed to the vector API somehow? I don't want to involve macros but don't know how it would be done without them.
It's a bit unusual, but you can achieve something like this with impersonate-vector:
$ racket
Welcome to Racket v8.11.1 [cs].
> (define (vector-view vec [start 0] [end (vector-length vec)])
(impersonate-vector
(make-vector (- end start))
(λ (placeholder pos zero)
(vector-ref vec (+ start pos)))
(λ (placeholder pos new)
(vector-set! vec (+ start pos) new)
0)))
> (define base
(vector 'a 'b 'c 'd))
> (define view
(vector-view base 1 3))
> view
'#(b c)
> (vector-set! view 0 'X)
> view
'#(X c)
> base
'#(a X c d)
An "impersonator" can interpose on certain operations—for vectors, vector-ref and vector-set!, with all other operations derived from those—and add arbitrary behavior. (Impersonators can only interpose arbitrarily where mutation is already allowed: immutable values/fields can only have chaperones, where interposition is limited to raising an exception or returning the value the base operation would have returned, possibly wrapped in a further chaperone.) The most prominent use of impersonators is to implement contracts, but impersonators are a lower-level and more general mechanism. For background on impersonators beyond The Racket Reference, I recommend “Chaperones and Impersonators: Run-time Support for Reasonable Interposition”.
In this example, the impersonator is wrapping a new placeholder vector that has the size of the “vector view”: the contents of the placeholder vector are completely unused. Instead, the interposition procedure for vector-ref accesses the target of the view. Likewise, the interposition procedure for vector-set! mutates the target vector: it returns 0 to be installed into the placeholder vector on the grounds that 0 is already there.