I'm not a fan of this kind of indentation. However no solution using \leftskip
is good, since theorems are implemented as lists; try adding an enumerate
environment to your theorem and see.
Your problem is that you use two different ems: the medium series one and the boldface one, which are different. So the two facts require a different solution.
\documentclass[a4paper]{scrartcl}
\usepackage{amsthm,thmtools}
\usepackage{lipsum}
\usepackage{showframe}
\declaretheoremstyle[
headfont=\kern-2.5em\bfseries,
bodyfont=\normalfont,
headindent=0pt,
]{INDENTthm}
\declaretheorem[
within=section,
style=INDENTthm,
name=Theorem
]{thm}
\usepackage{etoolbox}
\makeatletter
\AtBeginEnvironment{thm}{%
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}%
\patchcmd\thmt@original@endthm{\endtrivlist}{\endlist}{}{}%
}
\makeatother
\begin{document}
\begin{thm}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{thm}
\end{document}
This does the patch only for the thm
environment. As Zhen Lin correctly remarks in a comment, the
\patchcmd\thmt@original@endthm{\endtrivlist}{\endlist}{}{}%
line for a theorem named lemma
should become
\patchcmd\thmt@original@endlemma{\endtrivlist}{\endlist}{}{}%

If one has several theorem-like environments and all should share the hanging indentation, then it's better to abstract the procedure. The \xdeclaretheorem
command defined below will do just that.
\documentclass[a4paper]{scrartcl}
\usepackage{amsthm,thmtools}
\usepackage{etoolbox}
\usepackage{lipsum}
\usepackage{showframe}
\makeatletter
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}
\newcommand{\xdeclaretheorem}[2][]{%
\declaretheorem[#1]{#2}%
\expandafter\patchcmd\csname thmt@original@end#2\endcsname
{\endtrivlist}{\endlist}{}{}%
}
\declaretheoremstyle[
headfont=\kern-2.5em\bfseries,
bodyfont=\normalfont,
headindent=0pt,
]{INDENTthm}
\xdeclaretheorem[
within=section,
style=INDENTthm,
name=Theorem
]{thm}
\xdeclaretheorem[
sibling=thm,
style=INDENTthm,
name=Lemma
]{lem}
\begin{document}
\begin{thm}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{thm}
\begin{lem}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{lem}
\end{document}

In case only some theorem-like environment should have hanging indentation the code
\AtBeginEnvironment{#2}{%
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}%
}
should be added to the definition of \xdeclaretheorem
and the global patch removed. Of course, non indented environments should use \declaretheorem
.