I can't test that here, but why would:
/msg $chan $1-
not treat the | as a separator? This is why you have the switch for $read, so that you can not interpret lines as commands, right?
What happens here is that $1- is evaluated, then its content is considered a "pure" string, regardless of what's in it. I mean, $1- isn't evaluated twice, only once.
$read(), on the other hand, is evaluated twice (unless you use the 'n' switch). It was designed this way -- at first, its only purpose was to pick a line randomly from a file and interpret it as a script line.
By the way, I think that the 'n' behaviour should be $read's default, but I guess this would break a lot of (if not all) scripts.