The solution was unnecessarily over-complicated.

Below one seems simpler and more intuitive. It requires the hydra package.

(defun org-table-mark-field ()
  "Mark the current table field."
  (interactive)
  ;; Do not try to jump to the beginning of field if the point is already there
  (when (not (looking-back "|\\s-?"))
    (org-table-beginning-of-field 1))
  (set-mark-command nil)
  (org-table-end-of-field 1))

(defhydra hydra-org-table-mark-field
  (:body-pre (org-table-mark-field)
   :color pink
   :hint nil)
  "
   ^^      _p_     ^^
 _b_  selection  _f_           | org table mark ▯field▮ |
   ^^      _n_     ^^
"
  ("x" exchange-point-and-mark "exchange point/mark")
  ("f" (lambda (arg)
         (interactive "p")
         (when (eq 1 arg)
           (setq arg 2))
         (org-table-end-of-field arg)))
  ("b" (lambda (arg)
         (interactive "p")
         (when (eq 1 arg)
           (setq arg 2))
         (org-table-beginning-of-field arg)))
  ("n" next-line)
  ("p" previous-line)
  ("q" nil "cancel" :color blue))

(bind-keys
 :map org-mode-map
 :filter (org-at-table-p)
  ("S-SPC" . hydra-org-table-mark-field/body))

--

--
Kaushal Modi