Passing the entire command as one string to `eval` will allow it to be interpreted the way you would've expected. Of course, "eval is evil".
Code:
#!/bin/bash
id=10030
a='-f "authors:John Doe"'
t='-f "#translator:Jane Doe"'
eval calibredb set_metadata $a $t $id