Exceptions are thread specific, you can not raise them in one thread and capture them in an other, even if that "other thread" is the main application thread. Threads must implement their own exception handling or they will crash. in your example though you call ReceiveToApend in the main thread context which should allow you to capture the exception if it is raised during your call.
Then again you do not protect your data access properly for multi threading. It is possible that _canAppend could be true and pass with out raising the exception but become false shortly after. Why don't you use a more "safe" list like tthreadedlist or a tthreadedStringlist? Or at least study one to see the minimum requirements for a thread safe container.