Sin[x]==0
is an expression. It's not a string. It's not wrapped in Hold. So, each time Mathematica sees encounters test
it will "evaluate" it (i.e. apply its rewrite ruies, in this case using OwnValues). And once that replacement is made, it will try to evaluate again. If x
has a value (i.e. it has OwnValues) then that replacement will be done. And so on.
Maybe it will help if you use Trace.
Clear[x, test]
test = Sin[x] == 0
(*evaluates immediately and outputs Sin[x] == 0*)
Trace[test]
(*{test,Sin[x]==0}*)
x = Pi
Trace[test]
(*{test,Sin[x]==0,{{x,\[Pi]},Sin[\[Pi]],0},0==0,True}*)
Furthermore, note that OwnValues[test] has not changed
OwnValues[test]
(*{HoldPattern[test]:>Sin[x]==0}*)
That's just because RuleDelayed has the attribute HoldRest. Of course, you can explicitly change it:
test = Sin[x] == 0
(*True*)
OwnValues[test]
(*{HoldPattern[test]:>True}*)