TeX interpretiert `#` innerhalb einer Makrodefinition immer als Start eines Arguments und erwartet danach eine einzelne Ziffer für die Argumentnummer. Es gibt eine Ausnahme von dieser Regel: Folgt stattdessen ein weiteres `#`, so wird `##` als einzusetzendes `#` interpretiert. Daher muss man nicht nur bei der Definition von Makros innerhalb von Makros bei jeder Schachtelungstiefe die Anzahl der `#` verdoppeln:
% TeX-Beispiel für Insider
\def\aussen#1{%
\def\innen##1{Argument aussen: #1, Argument innen ##1}%
}
\aussen{aussen}\innen{innen}
\bye
sondern auch in Deinem Fall:
\documentclass{scrartcl}
\usepackage{hhline}
\newcommand{\hl}{\hhline{|=##=##=|}} % hier kommt's nicht mehr zum Problem
\begin{document}
\begin{tabular}{|c||c||c|}
\hline
1 & 2 & 3 \\
\hl
4 & 5 & 6 \\
\hl
7 & 8 & 9 \\
\hline
\end{tabular}
\end{document}
![Ergebnis mit viel zu vielen Linien][1]
Es sei mir hoffentlich gestattet, darauf hinzuweisen, dass bei echten Tabellen vertikale Linien fast immer mehr stören als sie nützen, da die Hauptleserichtung einer Tabelle horizontal sein solle sollte und diese dadurch behindert wird. Horizontale Linien können nützlich sein, sollten aber auf ein notwendiges Maß beschränkt werden.
[1]: http://texwelt.de/wissen/upfiles/test26.png