Right, MySQL's DELETE supports a couple of clauses borrowed from SELECT syntax, such as JOIN and LIMIT, but not all the clauses. GROUP BY and HAVING are not supported.
As I read your query, it seems to be simpler than you're making it. You really want to delete task_attachments that belong to only one task_id. And you have some conditions on the file name and creator id.
You could use an exclusion join for that. That is, try to join to a different task that references the same attachment id, and if none is found, the OUTER JOIN will return nulls instead. Then you test for nulls in your WHERE clause, and when that happens, you've found an attachment referenced by only one task_id.
DELETE
ta
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1
ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2
ON tsa1.task_attachment_id = tsa2.task_attachment_id
AND tsa1.task_id <> tsa2.task_id
WHERE
ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
AND ta.creator_id = 279
AND tsa2.task_attachment_id IS NULL;
I didn't see that referencing task_recursive is necessary at all in this query, since the task_id is already present in tasks_attachments.
Before you delete anything, it would of course be better to try that as a SELECT first, to double-check that my reformulation gives you what you need.
SELECT
ta.*
FROM task_attachments AS ta
INNER JOIN tasks_attachments AS tsa1
ON tsa1.task_attachment_id = ta.id
LEFT OUTER JOIN tasks_attachments AS tsa2
ON tsa1.task_attachment_id = tsa2.task_attachment_id
AND tsa1.task_id <> tsa2.task_id
WHERE
ta.file_name IN ( '000531994879c3bf.pdf', '000531994879c5a8.pdf' )
AND ta.creator_id = 279
AND tsa2.task_attachment_id IS NULL;