Por el tema de tu consulta-objeto original...
Haz la consulta que necesites con el tipo de relación que necesites, aunque no te dé los datos ordenados. En esta consulta olvídate del campo calculado que llama a la función.
Una vez hecha créate otra consulta sobre la original, metiendo todos los campos en el grid de la consulta, y es en esta segunda consulta donde añades el campo calculado que llama a la función, y la ordenas por los dos campos tal y como está en el ejemplo.
En cuanto a los nulos, añade un control de nulos en la llamada a la función. Como no recuerdo los detalles del ejemplo y ahora no tengo tiempo de mirármelo te lo pongo más o menos como debería ser el campo calculado:
datoOrdenado: Iif(isnull(elcampo);"";fncOrdenaDatos(elCampo))
Y en cuanto a la ordenación... ahí sí que poca cosa puedo decirte: para Access "10-1" es menor que "10-2", lo mires por donde lo mires. Quizá tengas algún espacio que influya, quizá tengas "algo" que influya... pero si los datos son exactamente esos Access lo ordena correctamente. Y, si no, haz una prueba filtrando sólo por esos dos registros en tu consulta original y dales ordenación, y debería funcionarte, salvo que, como te indicaba, tengas "algo" que influya y que sin verlo no puedo decir qué podría ser.