For reference (from the docs):
Update
Updates all 2D and 3D objects based on the given time, animation, physics,
etc. If time is 0 it uses the last frame time to step the simulation. If
you have already called StepPhysics this frame it will not be called again
for this frame.
Called automatically by Sync, you may either use Sync or Update(),
Render(), Swap() to manually sync. If you wish to have more control you
can break this down further by replacing Update with Update2D, Update3D()
Render
Draws all 2D and 3D created using an ID number to the current frame
buffer. It does not swap the backbuffer to the screen. It does not draw
sprites or objects you have created using pointers, you will either have
to draw them individually or assign them to a sprite manager to batch draw
them. In this case Render should still be called as it also draws the
print text. Called automatically by Sync, you may either use Sync or
Update(), Render(), Swap() to manually sync. If you wish to have more
control you can break this down further and replace Render with
Render2DBack, ClearDepthBuffer, Render3D, ClearDepthBuffer, Render2DFront
Swap
Displays the back buffer to the screen and clears the backbuffer for the
next frame, updates global time variables. Called automatically by Sync,
you may either use Sync or Update, Render, Swap one after the other to
manually sync.
There are also 2D and 3D specific versions of these commands if you need more control over whether your 2D is rendered in front of or behind any 3D. Or you can do multiple stages of drawing using these commands if you need to do something more complex... There are other creative uses as well, like rendering things to a separate render image...
In the CloneSprite() example, they were a little overzealous with the Update(0) and Render(). They were creating a sprite to use in the example so you don't have to provide your own just to run it. I'm sure the intention was to draw the X to the buffer (using Render()), grab an image to use for the sprite (using GetImage()), and then clone it (using CloneSprite()). All of that wasn't strictly needed, however.
Check out this portion of the GetImage() docs:
Grabs a portion of the backbuffer and creates a new image from it. The
position and size values must be in screen coordinates. Returns the ID of
the new image, this must be deleted when you are done with it. To use this
command effectively you must know how AGK draws to the back buffer. When
Sync is called AGK updates the positions of all objects with Update, then
draws them all to the back buffer with Render, without clearing it, then
displays the back buffer to the screen with Swap. It then clears the back
buffer and returns to your code, so if you were to call GetImage
immediately after Sync you would get a blank image filled with the current
clear color. Therefore if you want to grab an image of the current scene
fully drawn you must call Render then GetImage then ClearScreen to clear
the back buffer so Sync doesn't redraw everything over a fully drawn depth
buffer. If you are already using Update, Render, and Swap yourself instead
of Sync, then call GetImage between Render and Swap.
Basically, unless you are having trouble getting the effect you want, I would just stick with the good 'ol Sync for the most part.