That was it - exit 1, rather than return 1. Works as you described, and same with just displaying the error string.
BUT, now that the instances are preserved (yay!), when collection runs (every 5 minutes), my error-handling datapoint FileLoadError01 (for File Not Found) doesn't trigger an alert like it was doing before. Relevant bits are below, and I can see in Test Collection Script in the DataSource that it is indeed returning the correct output, but still when I look at the Raw Data tab for an instance, you can see where the normal flow of data stopped a few cycles ago, and now it's just NoData, which makes sense, since the main loop never starts to iterate through instances, because it bails once it sees it can't find the file. But whereas before that worked perfectly, now in the Raw Data tab, even though the collection script is sending the correct information to the FileLoadError01 datapoint, it's not triggering, because the raw data is ALSO showing NoData in the FileLoadError01 column.
It's like something is intervening after the script output but before or inside the datapoint, and converting "C:\ps\SocialDistortion.txt.FileLoadError01=1" to NoData, which wasn't happening before when I fed Active Discovery the in-script list of instances, but in Collection it's trying to read from the textfile. It worked fine there. But having Active Discovery (even though it's no longer removing the instances from LM) encounter a path with a fictitious file, something seems to convert the correct script output to NoData for the intended datapoint:
FileLoadError01 datapoint key:
##WILDVALUE##.FileLoadError01
Collection script Write-Host with key-value pair:
Write-Host "$VM_FQDN_Path.FileLoadError01=1" # $VM_FQDN_Path not found
Collection script output as seen in "Test Collection Script" (correct; used to trigger a File Not Found alert):
C:\ps\SocialDistortion.txt.FileLoadError01=1
Raw Data table, column value for the FileUploadError01 datapoint:
"NoData" (used to be 1, which would trigger a warning)