You can collapse the vector down to a single element, and then split it up using separate() as you suggest:
library(tidyverse)
tribble(
~a,
1:3,
4:6
) %>%
mutate(
b = map_chr(a, paste, collapse = ",")
) %>%
tidyr::separate(
b,
c("d", "e", "f"),
","
)
Might not be the most elegant way of doing it, and I'm not sure how well it will work if you have vectors of uneven length (probably just the usual separate() warnings, but this works for your simple example (assuming I've understood what you're trying to do correctly).