Your comments

xasik, could you please describe in more detail how to reproduce this behavior? Thanks!

Here is how it works:
All tags are tried to find out which should be suggested.
1) First, tag beginning is matched, verbatim
2) If 1 fails, tag is split into parts treating any non-alpha symbol as a separator. Then all resulting parts (which are alphanumeric) are matched from the beginning.

Example:
All tags: #tag1, tag2/subtag, tag3/#subtag
You have entered: #
 #tag1 is tried - tag beginning matches => #tag1 is suggested
 tag2/subtag is tried - beginning doesn't match, splitting gives ['tag2', 'subtag']. From these parts, none match.
 tag3/#subtag - begginning doesn't match, splitting gives ['tag3', 'subtag'], also no match.

So as you can see, the behavior you are observing is explained by the algorithm.
I think the algorithm could be improved introducing a two-stage split: first, split by '/' and match all child tags, then, split by punctuation.
Suppose you don't remember that the tag is already assigned and will expect it to appear. It not appearing will cause irritation. So I think this there's no great harm in listing tags that are already assigned.
Sorry Andrew but your suggestion came in a bit too late to change the implementation.
But even with the current implementation you can get what you want if you search by tag names.
It's used for Note Properties now ;) But Shift+Enter is not much worse IMO ;)