Is this how binding is meant to be used or am I completely misinterpreting it?
Binding is like adding extra "metadata" to the connection, which then is available to the receiver. It is indeed a nice way to add a bit more context, or adapt to a function having different argument count. Adding your string should be fine.
If I'm not misunderstanding, how do I specify that the bound argument is my NAME variable?
In the editor, you can only define simple binding values (no arrays, no references). You also cannot refer to a variable of a script, the value is what you'll write in the editor. Basically, you have to write the value of
NAME in the editor.
Alternatively, is there a way to access the Node that emitted the signal (there would be several instances in a scene), and get the NAME value that way?
It's not possible to do that from the editor, but it is possible with a connection made by scripts.
# Connects the button with a binding sending the button node itself
button.connect("pressed", root_node, "on_button_pressed", [button])
Any kind of value can fit, it's just that the editor is a bit limited to also allow them. They may not even save well in scene files, while a connection created by script can use any runtime value, which includes direct objects like nodes.