You can use intern to get or create a var in another namespace.
(intern ns name)
(intern ns name val)
Finds or creates a var named by the symbol name in the namespace
ns (which can be a symbol or a namespace), setting its root binding
to val if supplied. The namespace must exist. The var will adopt any
metadata from the name symbol. Returns the var.
So you could theoretically make your function do this:
(defn say-hello [target-namespace]
((intern target-namespace 'hello)))
However, this would be a very unusual thing to do in Clojure/ClojureScript and you can probably solve your problem more idiomatically using one of the polymorphism options such as protocols or multimethods. Protocols can handle most use cases, and is probably your best starting point (especially if you're coming from Java - they're very interface-like).
Syntax is like this:
(defprotocol Friendly
(say-hello [this]))
And you can create a number of datatypes that conforms to the protocol using defrecord.
(defrecord person [name]
Friendly
(say-hello [this] (println (format "Hi, I'm %s" name)))
(defrecord dog [name]
Friendly
(say-hello [this] (println (format "Woof, Woof! I'm %s" name)))
(say-hello (Person. "Bob"))
;=> "Hi, I'm Bob"