If you use an interrupt scheme, you donot need to know when the data has been arrived. The answer to your question depends on the situation of your application. Normally, when it is OK to run your program only to communicate through the serial port without doing anything, then, non-overlapped Operation is recommended. Otherwise, you will use overlapped operation.
Overlapped vs Non-Overlapped
When you use the serial port only to receive data, you will probably gain little by using overlapped operation. (You could use overlapped operation and mix the WaitForMultipleObjects with other operations from your application but this is generally a bad idea)
When you want to receive and transmit data and perhaps other serial port operations (DTR, ...) without knowing when either of them will happen in the same thread, then overlapped operation is very powerfull.
MultiThreaded vs SingleThreaded
When you want other operations in your application to happen asynchronously, perhaps a user-interface, then you should write it multithreaded.
So for an application that only receives bytes and logs them to a file (or prints them on the screen) a Non-Overlapped SingleThreaded application should be sufficient.