Does the wifi shield have the ability to trigger an interrupt when some data arrives, or must it be polled?
It must be polled. The actual connection triggers interrupts, but those are not available for your code to extend.
Does it have any kind of buffer like a UART
Depends on the specific shield and library, but, in general, yes.
but if its a no brainer that it needs the full attention of the CPU then I'll probably go the route of designing a special purpose wifi shield with its own uC on it.
What else is the Arduino doing? If the Arduino is already busy a significant portion of the time, will it really have time to act as a web server, too?