There are three parts to the answer:
write a function that deletes an
Effort entry from the properties drawer of the current headline.
write the corresponding
agenda function that calls the function above "remotely"; i.e. you call the agenda function in the agenda and it in turn switches context to the headline in the file and calls the first function above.
add an entry for the
agenda function to
org-agenda-bulk-custom-functions, consisting of the character that you use to call the agenda function and the symbol corresponding to the name of the function.
There are plenty of examples of remote functions in the Org mode sources, so I just copied the code from the
org-agenda-set-effort function and changed the local function that it calls, to come up with the following code (seems to work; very lightly tested):
#+begin_src elisp :results drawer
(defun org-delete-effort ()
(org-entry-delete (point) org-effort-property))
(defun org-agenda-delete-effort ()
"Set the effort property for the current headline."
#'org-agenda-delete-effort nil nil nil
(let* ((hdmarker (or (org-get-at-bol 'org-hd-marker)
(buffer (marker-buffer hdmarker))
(pos (marker-position hdmarker))
(setq newhead (org-get-heading)))
(org-agenda-change-all-lines newhead hdmarker)))))
So you mark the entries in the agenda, then do
B Y to delete efforts. I chose
Y as the character to call the function because it was not being used for any other bulk operation (in my case - YMMV).
This can obviously be used as a template for other such remote operations.