You can use the argument processors built into ltcmd/xparse:
\documentclass{article}
\NewDocumentCommand \nums { O{} >{\SplitArgument{1}{-}}m }
{\numrange[{#1}]#2}
\newcommand\numrange[3][]{from #2 to #3}
\begin{document}
\nums{3-10}
\end{document}

If you're indeed using siunitx you could consider using this instead:
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand \nums { O{} >{\SplitArgument{1}{-}}m }
{
\group_begin:
\keys_set:nn { siunitx } {#1}
\siunitx_number_range:nn #2
\group_end:
}
\ExplSyntaxOff
\begin{document}
\nums{3-10}
\end{document}