Echoing Scott's comment about there be a lot of variables but...
If the MongoDB cluster is sized to keep the last N days (hours) in memory then "seeking" isn't an issue except when going back beyond that horizon.
You can index on the full timestamp and then simply do a range query. e.g.:
{ timestamp : { $gt : Date(2012-08-12T00:00:00) , $lt : Date(2012-08-13T00:00:00) } }
The B-Tree indexes that MongoDB uses are designed to efficiently answer this type of query.
You can also create a compound index on { timestamp : 1, chat_name : 1} and it should speed up a query using both a range on timestamp and a range or value for the chat_name.
The only option I know if (other than the bucketed documents) to group the messages into chats is to use a collection per "chat" but I'd not recommend that unless you can enumerate the chats before hand. I have heard issues about scaling the collection count into the thousands but I prefer to just not go there.
The only mechanism I know of for controlling the allocation of blocks in MongoDB is the TTL Collections. I'm eagerly awaiting the 2.2.0 release so I can take it for a spin on my current project.
Rob.