La macro `\my@intervalle` est récursive (j'en profite pour faire remarquer que la récursivité n'est pas terminale, mais on s'en fiche un peu) et donc, lorsqu'elle est appelée avec via `\interff{1,2}`, elle reçoit comme argument `#1` : `1` et comme argument `#2` : `2, \relax \noexpand`. Pourquoi avoir mis ce `\noexpand` dans l'appel `\interff`, mystère.
Bon, comme l'argument `#2` n'est ne commence pas vide, par `\relax`, elle prend la branche `\else` et s'appelle-elle même avec son argument `#2` c'est-à-dire `\my@intervalle 2, \relax \noexpand\@eolst`.
Son premier argument `#1` est alors `2` et son 2e argument est `\relax \noexpand`. Rebelotte, comme `#1` n'est `#2` ne commence pas vide, par `\relax` mais par un espace (c'est lui la cause du plantage !), elle s'appelle à nouveau elle-même avec `\my@intervalle \relax \noexpand\@eolst`.
\relax\noexpand\@eolst`.
Et là, c'est le crash puisqu'il n'y a plus de virgule pour satisfaire l'argument délimité.
Je suggère et j'utilise, pour une saisie quasi-naturelle des intervalles la macro `\I` ainsi définie :
\documentclass{article}
\usepackage{amsmath}
\usepackage[frenchb]{babel}
\newcommand\mathactive[1]{\mathcode`#1"8000 \begingroup \lccode`~`#1 \lowercase{\endgroup\def~}}
\newcommand\I{%
\begingroup
\mathactive\;{\mathpunct{}\mathpunct{\mathchar`\;}}%
\mathactive\[{\right\delimiter\delcode`\[ \endgroup}%
\mathactive\]{\right\delimiter\delcode`\] \endgroup}%
\left\delimiter\delcode`}
\begin{document}
L'intervalle $\I[\dfrac12;3[$ et $\I]-1;+\infty[$.
\end{document}