Вы можете сопоставить детали, выполнить разбиение, а затем построить его так, как вы хотите.
/^((?:(?!\r?\n!)[\S\s])+)\s*\r?\n![ \t]*(.+)\s*\r?\n![ \t]*((?:(?!\s*\r?\n!)[\S\s](?:\s*\r?\n![ \t]*)?)+)/
https://regex101.com/r/Ji5ys6/1
Группа 1 = линии, разделенные на \s*\r?\n\s*
Группа 2 = foo
Группа 3 = бар, баз, ... разделен на \s*!\s*
^
( # (1 start), line1, line 2, ...
(?:
(?! \r? \n ! )
[\S\s]
)+
) # (1 end)
\s* \r? \n ! [ \t]*
( .+ ) # (2), foo
\s* \r? \n ! [ \t]*
( # (3 start), bar, baz, ...
(?:
(?! \s* \r? \n ! )
[\S\s]
(?: \s* \r? \n ! [ \t]* )?
)+
) # (3 end)