Thanks both of you for your help. It seems that both solutions will work with their own benefits.
Have them all at the same level (a bit more messy) and set to scenery means you can be flexible with descriptions using {object:name}
Have a nested object and use a container (tidier but more configuration) but means you're a bit more limited with text - prefix etc.
I had a look at the xml of a test project I created and given that rooms are just (sort of) parent objects I'm surprised this doesn't just work the way it is:
<!--Saved by Quest 5.5.5328.26617-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<game name="Test Methods">
<gameid>6f83f6c3-4ab7-4792-9ec0-08247102c2ac</gameid>
<version>1.0</version>
<firstpublished>2014</firstpublished>
</game>
<object name="room">
<inherit name="editor_room" />
<description>Child of room works = {object:Shelf}</description>
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
</object>
<object name="Shelf">
<inherit name="editor_object" />
<look>Child of Shelf doesn't work = {object:Book}</look>
<object name="Book">
<inherit name="editor_object" />
</object>
</object>
</object>
</asl>
The parent node room is happy to find a child node Shelf and parse it, but the node Shelf can't parse it's own nested node of Book.
Thanks again guys.