I've had more time to think on this, and have been looking at parallel blocking I/O. I've changed my mind, I now think that TBB should have some form of blocking I/O handling. I think the task based approach will work as well (leading to I/O tasks and algorithmic tasks), although I do believe that TBB should aim to expose some low-level details of threads so that it could be a universal threading package, without using current TBB constructs. I think that "blocking" tasks (algorithmic ones) in the task scheduler would lead to greater complexity for TBB, but could be useful (at least for me :-) ).
So far as implementation, one possibility is to have a worker thread spawned specifically for monitoring I/O. Such a thread would basically accumulate file descriptors that TBB wants to use for I/O, and use say poll() (on POSIX systems) to monitor for availability (and hence be blocked normally, although it could be done without an additional thread too). When I/O is possible, perhaps a special type of task will be spawned to deal with that I/O, which can be scheduled like other tasks. I'm not sure how to ensure that open file descriptors are shared between worker threads on all operating systems.
I'm not a threading expert, so I might be speaking nonsense but I'd be interested to hear what everyone thinks.