Two ways, without central NAT (which I personally dislike, as my background is mostly in Fortigates going back almost 20 years).
One, create a VIP with external interface VPN tunnel, external address 172.16.88.100, internal address 192.168.1.100. Create a policy from VPN to internal, source address whatever, destination target your VIP. Create a policy from internal to VPN, source and destination whatever (so long as it matches your networks), NAT enabled, using outbound interface IP.
This will work because by default, on a Fortigate, when you have inbound NAT for a certain IP, it will automatically create outbound NAT with the same settings. Be careful: if you create that VIP with external interface set to ‘any’, this IP will apply to ALL outbound NAT-enabled traffic, and can potentially break traffic - for example, if your 192.168.1.100 tries to NAT to internet as 172.16.88.100, your next-hop ISP router will not be able to respond to that. To avoid this in scenarios where you want this VIP to respond on multiple interfaces, there is a CLI-only option on the VIP level called ‘set srcintf-filter’ - you can use it to limit the interfaces that the VIP works with to a specified list, i.e. more than one, but not everything.
Another option is to use IP pools - this is outbound-only, i.e. it will allow 192.168.1.100 to access your other site masquerading as 172.16.88.100, but it will not let that other site to reach 192.168.10.100 by initiating sessions to 172.16.88.100. To use it, go to Policy & Objects → IP pools, create a pool of type ‘overload’ with external IP range 172.16.88.100-172.16.88.100, then create a policy from internal to VPN, NAT enabled, but instead of using outgoing interface address, select ‘Use Dynamic IP Pool’ and select the pool that you’ve created. This will override all other NAT settings - interface address, VIP, whatever - and masquerade all source addresses going through the policy as what is set in the IP pool. You can set the pool to use more than one address; in that case addresses will be assigned sequentially.
Note that VIPs, like IP pools, can also use IP ranges, which is quite useful. For example, you can create a VIP with external address 172.16.88.1-172.16.88.254 and mapped address 192.168.1.1-192.168.1.254. When you use that in a policy, the entire ranges are mapped one-to-one - i.e. if you want to reach 192.168.1.30, you can hit 172.16.88.30, and so on; the reverse is also true - i.e. 192.168.1.55 will NAT as 172.16.88.55 on its outbound sessions.