Мой опыт показывает, что OnClose возникает только при вызове Close. Тем не менее, OnDestroy всегда вызывается в случае освобождения (Free) или разрушения (Destroy) формы. Я помещал свой Table.Post в обработчик OnClose, но это не всегда вызывалось. Попробуйте поместить MessageBeep в обработчик OnClose, или найти какой-то другой способ выяснить когда точно ваш код будет вызван.
Я запускал тест, который предлагал выполнить Application.Terminate в обработчике события формы Destroy, а НЕ событий OnClose или OnCloseQuery, в отличие от VB.
Я так понимаю, что Task Manager в действительности не закрывает приложение. Он просто сообщает приложению о необходимости его закрытия посредством посылки ему соответствующего сообщения. Также, я надеюсь, что главное окно приложения, которое Delphi назначает вашему приложению, проходит по списку своих дочерних компонентов, которые оно имеет, и сообщает им об инициализации закрытия приложения. Но все это нуждается в тестировании, начиная от программного способа через Delphi, и заканчивая закрытием задачи через Task Manager. Сделайте это несколько раз, при этом поглядывая на счетчик ресурсов.