L7 matcher collects the first 10 packets of a connection or the first 2KB of a connection and searches for the pattern in the collected data. If the pattern is not found in the collected data, the matcher stops inspecting further.
I may be wrong, but my guess is that L7 matcher probably does not wait for all 10 packets or 2kB of data. So if you're looking for something that's not there, once it's not there in first packet, it does no longer matter if it would be e.g. in second one. So "not" with L7 is probably useful only for single-packet stuff like DNS. But again, I may be wrong, I didn't test it.
Both Windows and Linux don't seem to care if a DNS response comes from an IP that's different from where the request was sent.
I didn't test this either (it seems wrong, but maybe it's true), but it's not what happens when you redirect DNS queries to router's own resolver. It's NAT, so it will make sure that reply packet sent to client will have the source address used by client's request as destination.