要素数とかアロケーションによるかなぁ
たとえば要素数固定なら Option<[T; 3]> みたいなのから Iterator::flat_map で名前付きの型を作るなどの手があるし、要素数可変でも SmallVec を使うか Vec を使うかなど選択肢がいくらかある。
最高効率なのは enum を自分で作ることだと思うけど、それがダルい場合は結構いろいろ誤魔化し方があったりして
https://docs.rs/either/1.9.0/either/enum.Either.html#impl-Iterator-for-Either%3CL,+R%3E
either::Either なんかも Iterator 実装してるので、either::Either<std::iter::Once<T>, std::vec::IntoIter<T>> を使うのは楽かも