For your understanding, you need to know that when copying to points, there are several attributes that can affect rotation, including (but not limited to)
N, up and orient
.
The Copy to Points node recognises when these attributes exist on the template points and will rotate the copies accordingly.
One of the more confusing (but ultimately more elegant) ways to rotate copies is via the
orient
attribute.
orient
is technically a quaternion, but you don't need to know what a quaternion is or how it works (and indeed, none of us actually do, except a tiny fraction, I'd venture).
All you need to know is that Houdini can build a quaternion for you if you give it an axis to rotate around and the amount you want to rotate it by.
So just tell Houdini, "I want to rotate around X by 30 degrees," and it can spit out a valid
orient
attribute that Copy to Points can use.
You can supply this instruction via an Attribute Wrangle (using VEX) or an Attribute VOP (which is a node-builder for VEX).
Here is a VOP example in its simplest form to create an orient attribute that demonstrates the above:

Here is a breakdown:
The const (Constant) node supplies the angle in degrees.
The degtorad (Degrees to Radians) node converts that into radians, because Houdini internally uses radians for this stuff.
The rotate node uses that angle and a specified axis (in this case 1,0,0) to build a matrix that defines this transformation.
The matxtoquat node converts that matrix into a quaternion.
The bind1 node outputs that quaternion to the
orient
attribute.
I have attached the scene file to help you get started. It's a pretty deep rabbit hole, be warned, so you'll need to do some reading to catch up.