Um pouco vergonhoso, mas como não parecia haver nenhuma solução existente e como a tarefa parecia relativamente direta, escrevi um daemon Python simples para corrigir o problema. Ele usa a API python-xlib para capturar pressionamentos de tecla em todo o sistema e, em seguida, executa comandos shell personalizados. Ele assume uma configuração básica do Debian / Ubuntu, mas provavelmente funcionaria na maioria dos sistemas Linux com alguns ajustes.
No meu caso, as teclas de aumentar / diminuir o volume são mapeadas para o código 122/123; portanto, os comandos correspondentes para diminuir ou aumentar o volume somente quando a área de trabalho está bloqueada são:
gnome-screensaver-command -q | grep "is active" && bash -c '/usr/bin/pactl -- set-sink-volume `pacmd list-sinks | grep -P -o "(?<=\* index: )[0-9]+"` -10%'
gnome-screensaver-command -q | grep "is active" && bash -c '/usr/bin/pactl -- set-sink-volume `pacmd list-sinks | grep -P -o "(?<=\* index: )[0-9]+"` +10%'
É certo que isso é um pouco detalhado. O segundo grep é encontrar a interface de som ativa em sistemas que possam ter várias (por exemplo, meu laptop possui uma interface Master e Headphone, permitindo que esses comandos controlem).
Editar: isso não funciona mais no Ubuntu 16. Todas as funções do X parecem desabilitadas, mesmo a partir do terminal, quando a tela é bloqueada.