Il suffit d'ajouter `\leavevmode\vspace{-\baselineskip}` juste après `\begin{exo}` lorsque celui-ci est immédiatement suivi d'une liste (ici `enumerate`). Pour éviter d'avoir à le faire manuellement et systématiquement, on peut procéder comme suit (le code ci-dessous tient compte des améliorations apportées suite aux divers commentaires, notamment de l'astuce de @touhami) :
\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{enumitem}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{babel}
\newtheoremstyle{break} % ⟨name⟩
{} % ⟨Space above⟩
{0.5cm} % ⟨Space below⟩
{\normalfont} % ⟨Body font⟩
{} % ⟨Indent amount⟩
{\bfseries} % ⟨Theorem head font⟩
{} % ⟨Punctuation after theorem head⟩
{\newline} % ⟨Space after theorem head⟩
{} % ⟨Theorem head spec (can be left empty, meaning ‘normal’ )⟩
\theoremstyle{break}
\newtheorem{exo}{Exercice}
\ExplSyntaxOn
\bool_new:N \g_inside_exo_bool
\AddToHook{env/exo/begin}{
\bool_gset_true:N \g_inside_exo_bool
\AddToHookNext{para/begin}{\bool_gset_false:N \g_inside_exo_bool}
}
\AddToHook{env/enumerate/begin}{
\bool_if:NT \g_inside_exo_bool {
\leavevmode\vspace{-\baselineskip}
}
}
\ExplSyntaxOff
\begin{document}
\begin{exo}
bla
\end{exo}
\begin{exo}
\begin{enumerate}
\item a
\item z
\end{enumerate}
\end{exo}
\begin{exo}
blabla
\begin{enumerate}
\item a
\item z
\end{enumerate}
\end{exo}
\begin{exo}
\begin{enumerate}
\item a
\item z
\end{enumerate}
Puis :
\begin{enumerate}
\item a
\item z
\end{enumerate}
\end{exo}
\begin{exo}
\begin{enumerate}
\item a
\item b
\end{enumerate}
puis
\begin{enumerate}[resume]
\item c
\item d
\end{enumerate}
\end{exo}
\end{document}\end{document}