Never mind, even though the docs said jQuery would be loaded as _jQuery, it was actually loaded as $. I fixed it by changing my code to:
import spynner
browser = spynner.Browser()
browser.load_jquery(True)
browser.debug_level = 3;
browser.show()
browser.load("http://web.edval.com.au/#publicaccess")
browser.runjs(browser.jslib+'("[class^=login-text-box]").val("hi")')
browser.close()
Note that runjs now actually checks browser.jslib.