The main issue in the code is that you're calling cat with ${data[0]} as its argument. This will cause cat to try to open a file with that as its filename. This may be what you mean by "The JSON file is stored in the ${data[0]} array", but if it means that the file is literally stored in the array, then you need to use printf to pass that data to jq.
There's an additional issue with you trying to compare a number (in the JSON document) with a string (the value of $employeeId in the jq expression). This is easily remedied by using --argjson in place of --arg. Using --argjson will make jq assume that the value of the variable that you create is appropriately JSON encoded already.
Your modified script becomes
#!/bin/sh
id=123456
jq --argjson id "$id" '.[] | select(.id == $id).firstName' file.json
or, if you want to use the value in ${data[0]}:
#!/bin/bash
# other code here setting data[0] to some JSON document data.
id=123456
printf '%s\n' "${data[0]}" |
jq --argjson id "$id" '.[] | select(.id == $id).firstName'
If the query id comes from user input or some other external process, it may be safer to still use --arg and to convert the value in the document to a string to compare with in the select() expression:
jq --arg id "$id" '.[] | select((.id|tostring) == $id).firstName'