You don't need a macro for this.  And you don't need (but can certainly use) lexical binding.

<!-- language: lang-el -->

    ;; Without lexical binding:
    ;;
    (defun advise-once (symbol where function &optional props)
      (advice-add symbol :after `(lambda (&rest _) (advice-remove ',symbol ',function)))
      (advice-add symbol where function props))

    ;; With lexical binding:
    ;;
    (defun advise-once (symbol where function &optional props)
      (advice-add symbol :after (lambda (&rest _) (advice-remove symbol function)))
      (advice-add symbol where function props))

    (advise-once 'backward-word :before (lambda (_) (message "Eureka!")))