No idea on why %, but addressing your last question:
Operators are treated in a special way when parsing (official docs), so R probably wants to be sure it knows what's an operator. Remember, R allows a symbol to be shared by a function and a non-function:
"%in%" <- 1
`%in%`
# [1] 1
`%in%`(2, 1:4)
# TRUE
Now imagine no delimiters were required. And let's say package foo exports an operator named bar, which is basically just an identity check:
bar <- function(x, y) identical(x, y)
Consider this code:
library(foo)
bar <- NULL
bar bar NULL
Should it check if the newly-defined bar is NULL (which it is)? Or should it check if the function foo::bar is NULL (which it isn't)? And this is just with single-symbol expressions on either side. Imagine trying to parse this:
bar bar bar NULL