It seems org-property-values gets the property value for the buffer - it ends up getting the property value from the last subtree in the buffer. I solved this by using either (org-entry-get nil prop) or (car (org-entry-get-multivalued-property nil prop)) instead of (car (org-property-values prop)).
yields nil.* Top Heading#+NAME: get-property#+BEGIN_SRC emacs-lisp :noweb yes :var prop="prop"(car (org-entry-get-multivalued-property nil prop))#+END_SRC** Subheading:PROPERTIES::DUMMY: 100:END:#+BEGIN_SRC shell :noweb yesecho <<get-property(prop="DUMMY")>>#+END_SRC