Sob circunstâncias normais, as condições do filtro podem ser especificadas nas cláusulas WHERE ou JOIN. Eu costumo colocar filtros em WHERE, a menos que a precedência OUTER JOIN possa ser afetada (veja abaixo) ou se o filtro for muito específico para essa tabela (por exemplo, TYPE = 12 para especificar um subconjunto específico de linhas na tabela).
Por outro lado, as cláusulas ON e WHERE podem ser usadas para especificar condições de junção (em oposição às condições de filtro). Enquanto você estiver usando apenas junções INNER, ainda não importa qual você usará em circunstâncias comuns.
Se você estiver usando junções OUTER, no entanto, isso pode fazer muita diferença. Se, por exemplo, você especificar um OUTER JOIN entre duas tabelas (t1 e t2), mas, na cláusula WHERE, especifique um relacionamento eqijoin entre as tabelas (por exemplo, t1.col = t2.col), você acabou de converteu a associação OUTER em uma associação INNER! Isso ocorre porque WHERE pode ser usado para especificar um equijoin (ou talvez uma junção OUTER, dependendo da versão, usando a sintaxe * = obsoleta) sem usar uma cláusula ON, e quando WHERE indica um equijoin interno entre as tabelas, ele substitui um OUTER JOIN (se presente).
A pergunta original era sobre filtros, onde o tipo de junção geralmente não deveria ser um problema, mas uma junção também pode atuar como um filtro e, nessas situações, o posicionamento da condição de junção certamente pode ser importante.