You could use a data area to hold the next date to be run. If the job runs every two weeks, you could add 14 to the data area as the last step in the process. The job would compare the system date against the data area and execute if it’s the correct date.
If the job runs on specific dates in the month (1st and 15th), the data area would contain the next date to be run.
This may not be the most sophisticated solution, but I believe it will satisfy your requirements. You would need an entry in the job scheduler to execute the job.
Rather than running daily and counting down, create a *LGL data area and schedule the job weekly. Retrieve the data area and stash the value in a *LGL variable. Update the data area to be (*NOT &LGLvar). End the run if &LGLvar is one value; execute the code if it’s the other.
The data area can be updated manually (externally) if you want the job to run a week early or late.