Depois de arrancar tanto cabelo, descobri.
Acontece que o SUBSYSTEM do meu scanner é, na verdade, usb
. É por isso que a primeira versão da regra (a elegante) falha - como deveria, porque SUBSYSTEM não é igual a usb_device
.
A segunda versão funciona, mas por todos os motivos errados. As pessoas que fazem codificação estarão familiarizadas com esse tipo insidioso de bug auto-infligido. O Udev aplica a lógica AND às condições especificadas. Isso significa que, se qualquer das condições for avaliado como Falso, o GOTO não será executado e a carne da regra será executada. Misturar condições negadas com a lógica AND é apenas desagradável.
De qualquer forma, agora que consertei a primeira versão, ela funciona exatamente como esperado:
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="04a9", ATTR{idProduct}=="190d", SYMLINK+="scan-canon", MODE="0666", OWNER="misha", GROUP="scanner"
EDIT: Como ikrabbe aponta, as duas versões originais nunca foram logicamente equivalentes.