It seems like your intent here is to destructure the tuple (assign each of its elements to a separate symbol) rather than to iterate over it (declare one symbol and assign to it one element at a time, re-evaluating the body for each element).
Terraform templates do not have a destructuring assignment syntax, so to express this template you’ll need to refer to the tuple elements directly:
%{ for user in vpn_users ~}
[Peer]
# ${user[0]}
PublicKey = ${user[2]}
AllowedIPs = ${user[1]}
PresharedKey = ${user[3]}
%{ endfor ~}
Note that for this situation, where your template expects exactly four elements per item, the more appropriate data type for this variable would be list(tuple([string, string, string, string])), since your module won’t work properly if it doesn’t get exactly four strings. Using sequence-like types in this way is quite idiosyncratic, though.
For situations like this in Terraform it’s more typical to use an object type than a tuple type, since that then allows each of the attributes to have a descriptive name rather than just an index.