Можно ли передать неизвестное количество значений в sqllite3 запрос, без костылей?
К сожалению, нет. Только так:

placeholders = ", ".join(["?"] * len(names))
sql = f"DELETE FROM item WHERE NOT name IN ({placeholders})"
cur.execute(sql, names)
Насчет sqlite не уверен, будет работать или нет, но попробуйте
вместо (?) сделать выборку (SELECT ...)