Well, since the Application.AsyncCall() gets a TDataEvent parameter, which is 'of object', usually it contains an internal reference to a TForm. That handler (the parameter) will be invoked in the future, the form may be non-existent, i.e. the internal reference will be dangling.
To prevent this, it isn't enough just to stop firing AsyncCall's towards that form, you should also remove the already pending:
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Remove pending async calls
Application.RemoveAsyncCalls(Self);
...
end;
The same thing may happen with the second parameter of the AsyncCall() when used to transfer a pointer/reference to some dynamic object. It may be already destroyed at the time the handler is executed.