I have found a workaround that I'd like to share. If you throw an exception in a LAH, the task in which the logical attribute is used is stopped. So what I have done is created LogicalAttributeAdapter class, and use the toLogical() method to perform my checks. You have access to the entire User object, so you can do whatever you need.
If any checks fail, I throw an exception. The result is an empty page with the exception message, an button to go back to the search list, and an OK button to return to your home screen. This is exactly what I expected to see from an exception in the BLTH handleSetSubject() method.
To implement this, create a new LAH handler in the IM management console, and associate it with a mock |CheckAttribute|. Then add the |CheckAttribute| to the tasks where you want to perform the logical check. If you add it as a Hidden, ReadOnly attribute, the LAH toLogical() code will execute (and abort, if needed) without any visible trace of the mock attribute in the task.