No, I think this is just the difference between a highly specialized memcpy that hits the Vector’s memory directly and a hand-written for loop that works with all abstract arrays.
So the difference is that f1 turns into a copyto!(view(a, 1:100), b) while f2 turns into a setindex!. So the problem is just that we don’t have an optimized method for copying a view of an Array to another Array.
Another difference is that f2 returns a view of v, while f1 returns x. Changing both functions to return nothing improves the performance of f2 somewhat, although not enough to make up the difference.