clean_version=${project_version%%-*}
é a coisa correta para usar como você descobriu.
% e %% correspondem no end por definição, por isso não há necessidade de uma âncora como $ dizer correspondência no final.
Para referência # e ## correspondem no início.
O caso interessante é a expansão / , que corresponde a qualquer lugar por padrão. Aqui, o caractere primeiro sendo # ou % força o padrão a corresponder no início ou no final.