This is an artifact of the way scripting works. Each = command runs a script. When a script ends, any keys pressed by the script are implicitly released. This is because scripting was originally designed for scripts run through the script menu. For PTP, it would make sense to have a way to override this behavior.
If you do something like =press('zoom_in'); sleep(n) to hold the key for a specific time.
If you want to be able to press/release under your own control instead of a fixed wait, there are some other options
1) Use a long running script like the msg_shell rlib (see lua/rlibs.lua). This runs indefinitely and listens for messages, which you can send by putm. Not that while this script is running, any other chdkptp functions that expect to run a script will not work.
2) Use post_levent_to_ui (see http://chdk.wikia.com/wiki/LogicalEvent
) to send Canon keypress events. These should be called something like "PressWideButton", "UnpressWideButton", "PressTeleButton" etc. You can use get_levent_def_by_index(index) (described at http://chdk.wikia.com/wiki/Lua/Lua_Reference/Levent
) to iterate over the levents available on your camera.