The semantics you propose is inherently stateful: delays accumulates some state and [@@visitors]'s meaning (nitpick: I think it should be a floating attribute, [@@@visitors]) depends on the current state. You could design a similar facility using names for references instead of implicit state:
type foo =
Bar | Baz
let x : foo option ref =
ref None
[@@@deriving.for foo (visitors)]
(If we had access to the type-checking environment, [@@deriving.for p] could be valid for any qualified identifier p that points to a transparent definition in the current environment. Given the current ppx pipeline, I suppose that would have to be restricted to being in the syntactic scope of an actual declaration.)
Hongbo Zhang introduced a similar "deriving from a distance" feature in his preprocessor Fan, for the reason you give, and also to allow deriving boilerplate code of datatypes defined in third-party libraries without having to modify them directly.