After much headache due to the lack of a native function on listing Site information on devices, I have found a relatively simple workaround.
Create Smart Groups with no criteria assigned to each site.
ex. 'Location 1' Site, 'Location 2' Site, etc
Create New Policy\Configuration Profile with default config (that does absolutely nothing)
Scope this Policy\Profile to All Computers\All Users.
Add each of the Smart Groups for all designated Sites to the Exceptions.
Look at "Logs" for this Policy. It will contain all systems that are not assigned to any of the 'Sites.'
It may not be as simple as a report, but it gets the job done.
If you have the ability to run a query against the database (if you're on premise) you can run this:
select computer_id, computer_name from computers where computer_id not in (select object_id from site_objects where object_type =1);
Or, if you're Jamf Cloud, you should be able to request that query via support.
Its definitely an option, although I have found it to be a bit of a headache having to RDP to the server, hop into the console and run the commands every time Im curious whether something popped up.
My solution outlined above is set to always display in the JAMF Pro Dashboard which allows me to see at a glance whether anything new has popped up.
I know this is a bit old, but once you have each Smart Group set up, couldn't you have another Smart Group or search that excludes all of those Smart Groups? Trying to solve the same issue myself and this does seem to be heading the right direction. It's a shame they don't give an option like this though more directly.
You really want to stay away from utilizing nested groups (using the "Computer Group" criteria) in Smart Groups, espeecially if you have more than just a few machines/devices. Since Smart Groups recalculate each time a device updates inventory using nested groups can cause undue burden on the server and impact performance.
Fair enough. I ended up going with a saved inventory search for basically that reason as I remembered the issue we had when we used to try and parse updates based off naming and group membership. The inventory search did get me everything I needed though so I would definitely suggest it!