Or if you wanted to create the vector, you could use rep(a$col1[[1]], nrow(a))
Otherwise, if your goal is to create a "shifted" col1, I don't see the problem with your current b_vectorize, looks good to me, and the b_loop would be corrected if you didn't take the values from the column you were modifying, you could create a new column:
b_loop <- a
for(i in 2:10){
b_loop$col2[i] <- b_loop$col1[i-1]
}
b_loop %>%
select(col1 = col2)
Or if you want to modify col1 in place, loop in the other direction, from the bottom to the top.