Historically I was very much opposed to SET-WORD! and GET-WORD! being in paths, because the ergonomics were bad:
red>> p: to path! reduce [first [:a] first [b:]]
== :a/b:
>> type? p
== path!
You have something that's neither a SET-PATH! nor a GET-PATH! but it has colons at the beginning and the end. It's all kinds of confusing.
Ren-C has addressed that particular can of worms with a full design for the CHAIN! sequence type, and rules for its nesting in PATH! (and how TUPLE! nests in it). So you can get these weird looking structures, but they destructure unambiguously.
As For Sigils... At The Head They Must Be Illegal
You can't put a sigil in a sequence head position, because that would be ambiguous with wanting to apply the sigil to the path as a whole.
>> to path! [$foo bar]
** Error: This needs to be an error
The only way to allow it would be if we invented some kind of lexical escaping so we could tell the difference between $|foo/bar| and $|foo|/bar ... and I do not want lexical escaping of this kind.
But Sigils At Non-Head Positions... Maybe? 
There's no fundamental reason why sigils couldn't be on non-head positions in sequences. It works.
>> $a:$b
== a:$b ; bound
Part of me says "ugh, no, it makes everything uglier, don't let people make these ugly things!"
But one very compelling reason just for the above syntax is what I've called "dialecting function calls", such as for pointing the blame to a callsite with a FAIL.
So instead of:
my-api: func [x y z] [
if true [
if y < 100 [
fail:blame ["Value must be >= 100, not" y] $y
]
]
]
You could write:
my-api: func [x y z] [
if true [
if y < 100 [
fail:$y ["Value must be >= 100, not" y]
]
]
]
When you look at it like that, it's hardly a monstrosity. It's letting you push the variable to blame into the chain for invoking the function, in a way that's out-of-band with other refinements.
It could offer a cheaper way of asking to fetch variables, using @ to take the place of the old "get word" concept:
>> block: [index offset pointer]
>> index: 3
>> block.index
== offset
>> block.(index)
== pointer
>> block.@index
== pointer
It's measurably less expensive (no array allocation, cheaper to naviate to on fetch). It doesn't use a GROUP! so it doesn't get in the way of COMPOSE-ing.
Think I Have To Allow It...
I'd originally thought that it would be cleaner to disallow it. But seems to me there are too many interesting uses.
As a medium, Rebol is very free, and you have a lot of power to make hideous things. So it's about using your judgment, and I think people should know when it's getting too crazy.
I Almost Hate To Point It Out, But...
This is true of quotes as well.
>> 'a:''b:'''c
== a:''b:'''c
There's an unambiguous way of interpreting that.
>> quote to chain! [a ''b '''c]
== 'a:''b:'''c
I don't love it, but, maybe there's cases where foo:'bar would be useful in a dialect, and if it's mechanically consistent I shouldn't prohibit it.
I don't know.