Com zsh você pode usar a string e qualificador glob :
for f (./*.pdf(.e_'[[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj'_))
xournal $f &
A string [[ ! -f $REPLY:r.xoj ]] || REPLY=$REPLY:r.xoj é executada como código shell. REPLY contém o valor do argumento atual. Se não houver nenhum arquivo .xoj correspondente para o arquivo .pdf atual, então [[ ! -f $REPLY:r.xoj ]] retornará true e nada acontecerá ( REPLY permanecerá inalterado).
Se houver um arquivo .xoj correspondente para o arquivo .pdf atual, [[ ! -f $REPLY:r.xoj ]] retornará false e REPLY=$REPLY:r.xoj será executado, o que substitui (via modificador :r ) a extensão .pdf do argumento atual com .xoj .