Причина, по которой шаблон (Session Appointment[^B]+)(?=\n)
соответствует до Total: XXX, заключается в том, что следующая строка начинается с Booking.
[^B]+
соответствует любому символу, кроме B
, а положительный прогноз (?=\n)
утверждает, что прямо справа - это новая строка, которая относится к строке, начинающейся с Booking.
Если вы хотите сопоставить (обратите внимание, что для сопоставления только вам не нужна группа захвата), вы можете сопоставить все следующие строки, которые не начинаются с Billing:
^Session Appointment.*(?:\r?\n(?!Billing\b).*)*
Regex demo
Если вы также хотите сопоставить Billing, вы можете добавить \r?\nBilling
после шаблон.