1) Насколько я вижу, вы запускаете другой процесс и устанавливаете обработчик события его завершения. А затем - вызываете необрабатываемое исключение в исходном процессе. Как вы его собираетесь перехватывать? Подсказка: чтобы смотреть что в каком процессе существует, выводите в печати на консоль свойство Id процесса. Текущий процесс, кстати, можно получит статическим методом Process.GetCurrentProcess,
2) Необработанное исключение само по себе не вызывает завершение процесса с точки зрения ОС. Исключение перехватывается где-то в коде среды выполнения, как необработанное. Где именно - смотрите ее исходный код, он доступен.
3) Исключение вызывается в момент любого ожидания завершения задачи: Wait, await, GetResult...
Но вам это тут ни к чему - никакого исключения у вас в этом Task не выбрасывается. Чтобы выбросить исключение в контексте задачи, на которую указывает свойство Task объекта класса TaskCompletionSource, надо использовать метод SetException этого объекта.
4) Вы желаете странного. Зачем?