I don't think this is going to be easy either way: Either you write some custom code for the poller/waiter/asynchronous process (so there's complexity there as well as cost, maintenance, etc.) or you continue to do what you're doing (having the Lambda function wait - which is cost but far less complexity).
Yes, there are ways to do this: For example, you could have the Lambda function store the status of the SQS message in a database (DynamoDB for example) so that you can track the in-progress items; but now you're recreating the queue logic in a separate place.
You hint at something but don't directly say it: It sounds like you (a) need to process the messages in order and (b) only want to process a certain number at a time. Why is that? Is there a threshold load on a back-end system that can't be exceeded?
It might be possible to provide another solution if you could give more context to what you're trying to achieve.
AWS Step Function Output for container servicesAccepted Answerasked 7 months ago
What if a Lambda function fails to process an SQS message within the visibility timeout of the queue?asked 2 months ago
Typescript - Types for SQS messages in lambda functionAccepted Answerasked 4 years ago
Step Functions SQS Queue in different regionasked 3 months ago
Set UserData for RunInstances step functionasked 9 months ago
How can I prevent an Amazon SQS message from invoking my Lambda function more than once?EXPERTasked a year ago
Trigger Step Function with API Gateway and use Fargate within Step Function?asked 8 months ago
SQS Step Function Poller without Lamdaasked a month ago
Return Value from Lambda function triggered by SQS to individual clientAccepted Answerasked a year ago
How To Detect BatchItemFailure support from Lambda SQS Eventasked 8 months ago