I think the main overhead you are seeing is from the copies you perform when you write a[:,1].
Also you are benchmarking in global scope which might skew things a bit. Try:
using BenchmarkTools
a = rand(Float64, (1000, 2))
b = @benchmark $fitness($a)
c = @benchmark @views $f.($a[:, 1], $a[:, 2])
Apart from that: A broadcast is not very different from writing a straight-forward loop. In Julia loops are fast and you don’t to “vectorize” for performance like in Python.