The . in .* matches any character including % so it'll match up until the last % on the line. To match up until the first % on the line you'd need to match any non-% character instead which would be:
sed -En 's/([^%]*)%.*/\1/p'
but you could have made that more concise with:
sed 's/%.*//'
Realistically, though, if you're going to use an external tool for this, this is the job that cut exists to do:
cut -d'%' -f1
Regarding your use of double quotes in sed -En "s/(.*)%.*/\1/p" - in shell you should always use single quotes around every string (including scripts) until you need double quotes or no quotes, see https://mywiki.wooledge.org/Quotes.
echo '/documents/types/count/%5B%22cast%20arinfo%22%5D' | sed "s/%.*//"var='/documents/types/count/%5B%22cast%20arinfo%22%5D'then parameter substitution would also work, eg:"${var%%\%*}"thoughbashappears to be smart enough to know that a 3rd%is a literal so"${var%%%*}"also works