Is there a way to give out ERC20 tokens indiscriminately under a certain condition, but not by receiving eth? i.e without using the fallback function?
Ether is not tied to tokens in any way. The only part where you have to have Ether is to pay for the transaction costs.
You can distribute your tokens based on whatever criteria you wish. Some hand them out in so-called airdrops, where they are given out half-randomly to different places without asking if the receiver wants them or not.