I've simplified the query slightly and it now does what it was meant to. Here's the new query:
SELECT str1._id, str2._id
FROM story AS str1, story AS str2
WHERE str1._id < str2._id
AND (SELECT chr_id
FROM participant
WHERE isparent = 0
AND str_id = str1._id
INTERSECT
SELECT chr_id
FROM participant
WHERE isparent = 0
AND str_id = str2._id) IS NULL;
The mystery stands, however, of why the original query did not work.