You could check if the Particles are inside the Camera Frustum in the update context and modulate either the lifetime or Alive attributes.

Now if your player moves very fast, or just turns the camera fast enough, all particles will be erased. And you’ll need to have a high spawn rate to refill the screen, which could be pretty tricky to balance.
And if the player doesn’t move the camera, the particles will have a tendency to concentrate in this frustum.
Now, you might still be interested in a solution that is using a Camera Frustum mask. Thanks to @PaulDemeulenaere and @maximeg_unity I was able to get you one:
float3 viewPos = WorldtoViewportPos(MainCam, attributes.position);
float2 maskXY = saturate(abs( Remap(viewPos.xy, 0, 1, -1, 1));
maskXY = step( 1, maskXY );
float maskZ = Remap(viewPos.z, MainCam.NearPlane, MainCam.FarPlane, 0, 1);
maskZ = step( frac(maskZ, 0.000001 );
float camFrustrumMask = maskZ * maskXY.x * maskXY.y;
The mask here is either 0-1, but you could modify the computation to smoothen the mask. You could use this to modulate the age of your “out of frustum particles”.
Here are some explanations and visualizations to help you better understand the Frustum mask is computed and how to modify it to your need.
Disclaimer: There might be a better way to compute this.
-
First, we convert our Particle Position to the Camera Viewport Position.
If we focus on the X component, this is what we get:
The X Values range from 0-1 inside the Camera Frustum and negative (negative numbers aren’t properly disaplyed) or above 1 outside the frustum.
-
Remap the values from 0<>1 to -1<>1:
The 0 is now centered in the middle of the camera.
-
Absolute :
The values now range from 1<>1 inside the frustum.
-
Saturate:
We prevent values from going above 1 outside the camera frustum.
-
Step function:

The step allows us to get a 0/1 value mask.
The same is done on the Y Axis.
For the Z component:
Multiplying the different component together then gives us the final 0/1 mask

Now, that how to get the camera frustum mask has been explained, you might also consider “Warping” your particle’s position inside a volume. This is a solution that is commonly for VFX that needs to be happening near the Camera, like Snow, rain drops or mist. The Tile/Warp position block lets you tile your particles inside a volume.
In this set up, my VFX is attached to the camera and the particles spawn inside a Sphere Volume.
The Tile/warp block is set inside the Update Context.

This solution allows you to Re-use particles by making them tile inside the defined volume. This is easier to manage and usually gives good results. Now you can also mix this approach with the Camera Frustum mask approach.
If you would like to learn more about View-wrapping particles, you can take a look at this old but good tutorial about it. While it’s inside another pretty cool VFX editor (PopcornFX), you should be able to grasp the concept and simply use the Warp/Tile Block inside VFX Graph.
I hope that this will help you achieve what you’re looking for, and don’t hesitate to share the results with us. 