Ich würde vorschlagen `tabular*` zu verwenden und den Text einfach unter die Tabelle zu schreiben anstatt `\multicolumn` zu verwenden.
\documentclass[a4paper,12pt]{scrartcl}
\usepackage{setspace}
\newcommand\sym[1]{\ensuremath{^{#1}}}
\newenvironment{tabledescription}{\smallbreak\justify\itshape\scriptsize}{\par}
\makeatletter
\newcommand\justify
{\let\\=\@normalcr
\rightskip=\z@
\leftskip=\z@
\parindent=\z@
\parfillskip=\@flushglue}
\parindent=\z@ % maybe \f@parindent?
\parfillskip=\@flushglue
\relax}
\makeatother
\begin{document}
\onehalfspacing
\begin{table}[htbp]
\centering
\singlespacing
\captionabove{Different variables}
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}}l*{4}{c}}
\hline\hline
& \multicolumn{1}{c}{(1)} & \multicolumn{1}{c}{(2)} & \multicolumn{1}{c}{(3)} \\
& \multicolumn{1}{c}{x} & \multicolumn{1}{c}{x} & \multicolumn{1}{c}{x} \\
\hline
y1 & 0.372 & & \\
& (0.16) & & \\[1em]
y2 & & 2.277 & \\
& & (1.14) & \\[1em]
y3 & & & 0.791\sym{**} \\
& & & (2.71) \\
\hline\hline
\end{tabular*}
\begin{tabledescription}
The table shows the results of an OLS estimation. \textit{t}
statistics in parentheses.
\sym{*} \(p<0.1\), \sym{**} \(p<0.05\), \sym{***} \(p<0.01\)
Hier wird ein langer Text eingefügt, der über mehrere Zeilen
geht. Ansonsten geht der Text über die Tabelle hinaus. Zwischen
den einzelnen Reihen soll ein einfacher Abstand sein.
Hier wird ein langer Text eingefügt, der über mehrere Zeilen
geht. Ansonsten geht der Text über die Tabelle hinaus. Zwischen
den einzelnen Reihen soll ein einfacher Abstand sein.
\end{tabledescription}
\end{table}
\end{document}
[![alt text][1]][1]
[1]: https://texwelt.de/wissen/upfiles/test_413.png