So far I have written this code...

(defun org-capture-expand-headline (headline)
  "Expand functions, symbols and strings for HEADLINE.                                                                                                                                        
When HEADLINE is a function, call it.  When it is a form, evaluate                                                                                                                            
it.  When it is a variable, return its value.  When it is a string,                                                                                                                          
treat it as a headline title. When it is `t', select existing headline                                                                                                                        
title or enter a new one.  In any other case, raise an error."
  (let* ((headlines (org-map-entries (lambda ()
                                       (org-element-property :title (org-element-at-point)))))
         (final-headline (cond ((stringp headline) headline)
                               ((functionp headline) (funcall headline headlines))
                               ((eq headline t) (completing-read "Enter headline: " headlines  nil 'confirm))
                               ((and (symbolp headline) (boundp headline)) (symbol-value headline))
                               (t nil))))
    (or (org-string-nw-p final-headline)
(error "Invalid headline: %S" headline))))


and I updated `org-capture-set-target-location' to use that function when handling with target `file+headline'

What I am concerned about is the amount of tests I might have to write or update for `org-capture'.

testing/lisp/test-org-capture.el                                                                                                                                                              
125:          `(("t" "Todo" entry (file+headline ,file "A") "** H1 %?"))))                                                                                                                    
144:             `(("t" "Todo" entry (file+headline ,file2 "A")                                                                                                                              
175:          `(("t" "Todo" entry (file+headline ,file "A") "** H1 %?"))))                                                                                                                    
221:          `(("t" "Todo" entry (file+headline ,file "A") "** H1 %?"))))                                                                                                                    
233:          `(("t" "Test" entry (file+headline ,file "A") "** H\nFoo"                                                                                                                      
243:         `(("t" "Test" entry (file+headline ,file "A") "** "                                                                                                                              
279:          `(("t" "Item" item (file+headline ,file "A") "- X"))))                                                                                                                          
312:          `(("t" "Item" item (file+headline ,file "A") "- X"))))                                                                                                                          
323:          `(("t" "Item" item (file+headline ,file "A") "- X"                                                                                                                              
337:          `(("t" "Item" item (file+headline ,file "A") "- X"                                                                                                                              
358:          `(("t" "Item" item (file+headline ,file "A") "- X"                                                                                                                              
371:          `(("t" "Item" item (file+headline ,file "A") "- X"))))                                                                                                                          
538:                `(("t" "Table" table-line (file+headline ,file "Inbox")                                                                                                                  
552:                `(("t" "Table" table-line (file+headline ,file "Inbox")                                                                                                                  
723:                `(("t" "Text" plain (file+headline ,file "A") "Foo"                                                                                                                      
733:                `(("t" "Text" plain (file+headline ,file "A") "Foo"

How do you think it should be tested if the headline can be 4 different types?

Apology in advance if the formatting is off.