It should be:
for i in $(cat file); do cp binaryfile.docx "${i}_binaryfile.docx"; done
EDIT:
You can reproduce it with this example:
$ i=1
$ echo $i
1
$ echo $i_7
$ echo ${i}_7
1_7
The point is that _ (underscore) character is allowed in variable
name. You can read about it in man bash but keep in mind that it's
written in a very technical, succinct language:
name A word consisting only of alphanumeric characters and underscores, and
beginning with an alphabetic character or an underscore. Also referred to
as an identifier.
And later on:
A variable is a parameter denoted by a name.
And:
${parameter}
The value of parameter is substituted. The braces are required when
parameter is a positional parameter with more than one digit, or when
parameter is followed by a character which is not to be interpreted as
part of its name. The parameter is a shell parameter as described above
PARAMETERS) or an array reference (Arrays).
So if we have a variable named i and we want to print its
value next to adjacent _ we have to enclose it in {} to tell
Bash that the name of the variable ends before _.