Just to close this off I thought I'd share the solution I actually settled on..
First, I should clarify that I'm using group attachments on the Form tab so these all get stored in CMS_Attachment table.. an odd side effect of this is the related document type table seems to get an additional field for this group but never actually gets used i.e. it's always null. So, on to my solution:
1. I created an additional field on my doc type(s) "HasAttachments" (boolean). This never gets shown on the Form. I configure this as a "Searchable" field so that it's available in search results.
2. I have created a couple of event handlers
ObjectEvents.Delete.After and
ObjectEvents.Insert.Before which monitor for attachments ("cms.attachment") being added to/removed from my document types. I update the "HasAttachments" field accordingly. i.e. on insert it will alwsy be set to true (unless it's true already), on delete it will get set to false only if there are no more attachments in the group.
3. This now gives me a field that I can now use directly in my SmartSearch transformation in order to indicate whether the result has an attachment e.g.
<li <%# If(GetSearchValue("HasAttachments"), "class=\"hasAttachment\"", null) %>>
4. It also allows me to easily configure a Smart Search filter to filter results based on whether they have attachements or not i.e.
;;All
+hasattachments;true;With attachments
+hasattachments;false;Without attachments
I've summarised all this for brevity but hopefully it's clear enough for anyone else to decipher although an understanding of smart search and filters are required.
I'm happy to consider better alternatives but this was pretty simple to implement and works very well.