When you issue an rclone command, rclone doesn't know whether xxx-ws:/xxx.org/code/hello_test.txt
refers to a file or a directory. That is where the first HEAD command comes from - figuring that out.
Unfortunately rclone throws the result of the HEAD command away due to the internal architecture (I would like to change this but it is a lot of work!), so the second HEAD is required to see if the object exists or not before issuing the DELETE.
If you are desperate to avoid that extra HEAD use
rclone rc --loopback operations/deletefile fs=s3:rclone/ remote=/test.txt -vv --dump headers
The /
on the end of the fs=/
means that rclone knows the remote points to a directory so doesn't need to HEAD it to see if it is a file.