<<EOF results variable expansion happening on the local machine, but you only defined the variable i on the remote machine. You need to think carefully about where you want to do the expansion. You haven't explained in your question whether the value of i is defined client-side or server-side, but I'm guessing from your subsequent comments that you want it done server-side. In that case you'll need to pass the array contents over ssh, which requires careful quoting:
ssh hostname@server <<EOF
i=1
eval `typeset -p array_local`
echo \${array_local[\$i]}
EOF
typeset -p array_local will output the string
declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
Since this is inside backticks, it will get expanded client-side within the EOF-delimited heredoc, and then evaluated server-side by the eval. In other words it's equivalent to:
ssh hostname@server <<'EOF'
i=1
declare -a array_local='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
echo ${array_local[$i]}
EOF
Notice the difference in EOF quoting between the two examples. The first one allows parameter and shell expansion, and the second doesn't. That's why the echo line in the first one needs quoting, to ensure that parameter expansion happens server-side not client-side.
array_local) defined on your local system will be magically pre-defined for you in a different shell session in a completely separate process running on a remote server? That variable is local to the shell that runsssh, and, even if you figure out the proper quoting to use, it is not set in the shell instance that runsecho...${array_local[*]}. The way you are running that, it is expanded on the local end, before it is passed to the remote server. What the remote server sees isecho 1 2 3 4 5. The local variable is not available on the remote end.