Thanks for the suggestions, I didn't think of using the index i as the argument of an anonymous function!
I also thought of using a recursive function:
extract_head = function(vec1, vec2 = NULL){
if(is.null(vec2)){
vec2 = list(head(vec1, 5))
vec1 = tail(vec1, -5)
}
head1 = head(vec1, 5)
vec2 = list(vec2, head1)
vec1 = tail(vec1, -5)
if(length(vec1) != 0){
extract_head(vec1 = vec1, vec2 = vec2)
} else {
vec2
}
}
extract_head(vec1 = seq(1:100))
but I know recursive functions are not fast in R (plus the function above does not work as expected
, I think what we see is the call stack, or maybe it does work as expected, since R does not optimize recursive functions!)
EDIT: When running your examples I only get list of NULLs returned 
A slight modification of my function returns what I expected:
extract_head = function(vec1, vec2 = NULL){
if(is.null(vec2)){
vec2 = list(head(vec1, 5))
vec1 = tail(vec1, -5)
}
head1 = head(vec1, 5)
vec2 = purrr::prepend(vec2, list(head1))
vec1 = tail(vec1, -5)
if(length(vec1) != 0){
extract_head(vec1 = vec1, vec2 = vec2)
} else {
vec2
}
}
extract_head(vec1 = seq(1:100))