One of the first functions a new R user learns how to use is the lm() command, which involves stating the model formula.
After a while, this just becomes a natural way to say "I want a regression of y on x1 and x2 using mydata." Even though it is natural, the underlying structure of the formula is not as it first appears. This becomes apparent as soon as you need to work with formula objects when writing your own function.
Does ~ define a string? No. You can ask R directly whether the formula is a string (of class "character") using is.character().
As we will soon see, a formula isn't easily coerced into a string either.
Should we think of ~ as a fancy = sign? No. R doesn't think of ~ as defining an equation to be evaluated.