Just some technical details - and mostly I am just guessing. But in terms of “sleeping” and “runable”, these are probably relating to very low level threading concepts, such as whether the process is waiting for IO to respond. For example, if a process reads from the disk, then it will be sleeping waiting for the OS to read the data, and “runable” when the data has been fetched.
It is likely that while an app is waiting for events to process and not doing much, it will mostly be sleeping. But it will also likely wake up periodically to do things (certainly if it has any background processing, including stuff like displaying state or periodic saving or whatever).
In terms of the OS concept of “not responding”, that would likely be related to the app not processing events on the event queue. This is quite a difference concept.
So an app that is “not responding” could be frozen in a loop (“runable”) or frozen waiting for IO (especially network) (“sleeping”), or it could be doing other stuff and just not processing the event queue (eg rendering a large PDF for printing) (which could be “runable” or “sleeping” depending on what exactly it is doing).
I would guess the best way to determine if a application is “not responding” would be to send it a trivial AppleEvent/AppleScript request and see if it responds in a timely manner. Presuming there is some AppleEvent it can respond to (or perhaps even an AppleEvent that it does not handle would work, since you would get a response back saying it is not handled, but only after the app had a chance to say so).