It would probably be faster to supply a hard-coded list, but where are you going to get the list from? By running that subquery first, then using it to generate the list and then building the new SQL statement from it? That approach would definetely be worse than the all-in-one query.
create a temp table with all the quest_id to be deleted in it.
create table quest_temp as select quest_id from VERSION_ITEM WHERE VERSION_ID = 28831 AND RESP_SCALE_ID = 1 and then selecting from this table in your delete statement.