Hi there
We can do this without resorting to custom code, so let's.
First up, let me clarify the workflow, because I'm not sure from your question you are doing the same, although it's what I would expect, and in any case if you have something different the principles should be the same and you can adapt what I describe.
My test site has a one-to-many relationship with project-tasks, and I set it up to have the same requirements as your scenario, i.e. any user can only add one task (child post) to a project (parent post).
I created a Form to publish tasks (which includes a parent selector).
I added the Form to a page.
I'm going to add a link to the form to publish child posts to the template for parent posts, so that when I'm looking at a Project on the front-end I see a link to add a Task.
Ordinarily I would edit the template for Projects and use the Toolset Forms button to insert the link to the add task form. If you are using the Blocks UI right now you'll struggle to find this (these are the kind of things where the Blocks UI is still catching up the existing UI). Use a Classic Block where you will see the Toolset Forms button (in icon form) which you can use to insert link to the child post.
But! Don't do that right now, because we are going to use a View to handle hiding the form link for users who already added a child post.
So, create a View to display the child posts. You will need to insert two Query Filters to limit which child posts are returned. We want the View to return child posts which belong to the current parent post that are authored by the current user.
So the first is a relationship filter that will specify the parent according to where this View is displayed, and the second specifies the post author (see screenshot; you'll find something similar in the sidebar if you are using the Blocks UI).
Now to set up the output section.
If there are any such posts already then we don't want to output anything. If there are no such posts (the user didn't add a child post yet) then it's okay to output the link to the form.
So I don't output anything in the View loop, and instead in the no items found section I use the Toolset Forms button to insert the shortcode that generates the link to child post form.
My output section then looks like this:
[wpv-layout-start]
[wpv-items-found]
<!-- wpv-loop-start -->
<wpv-loop>
</wpv-loop>
<!-- wpv-loop-end -->
[/wpv-items-found]
[wpv-no-items-found]
[cred_child_link_form form='38' parent_id='-1' text='Create new task' target='_self']
[/wpv-no-items-found]
[wpv-layout-end]
You can do this with the Blocks editor for Views, but you will find it easier with the Classic editor because you can't use the Toolset Forms button to generate the no-items-found content, it currently only accepts text.
Lastly, to simplify the formatting, you can check the option "Disable the wrapping DIV around the View".
So I return to edit the template for the parent Projects, and insert this View where I want the edit link to appear, and it only will appear to users who have not already added a child post to that parent.
That's what's required, I realise you may need more details for some of the steps.
If so, let me know where you get stuck.