Replace your grep with:
vec <- c("blah", "has_bacon", "has_ham", "has_socio")
grep("^has_(?!socio$)", vec, value=T, perl=T)
# [1] "has_bacon" "has_ham"
(?!...)
is a negative lookahead operator, which looks ahead and makes sure that its contents do not follow the actual matching piece behind of it (has_
being the matching piece).