Nos dois primeiros exemplos, você cita seu argumento. Essas aspas são vistas apenas pelo seu shell, que trata a string inteira como um único argumento, em vez de dividi-lo nos espaços. As citações em si não são vistas pelo programa.
Ao digitar OPTSTR="'key1=val 1,key2=val 2,key3=val 3'"
, o conteúdo de sua variável contém aspas simples e, posteriormente, será dado ao seu programa. Seu programa vê as aspas, não as espera e, portanto, falha.
Use simplesmente:
OPTSTR="key1=val 1,key2=val 2,key3=val 3"
someprog -flag "$OPTSTR"
A diferença entre aspas simples e duplas é se você quer que o seu shell substitua variáveis e coisas assim ou não.