@jblane
First there is no collection size limit. There is a row limit to the number of rows allowed to be returned from a datasource at any given query, but that is not a collection limit.
So, the key to working around delegation is to first Filter the amount of records you want to perform FirstN / LastN or any other non-delegable function. If you can, within your FirstN apply a filter to the datasource that will return a smaller number of rows, then the outer functions will not be impacted.
Example: FirstN(Filter(myData, Status="Active"), 100)
If I know that there will never be more than 2000 Status="Active" records, then this will filter the rows and return a list of less than that and the FirstN will be just fine.
Note: this will STILL give you a delegation warning. If you know your data is in limits, then you can ignore.
If you hate seeing the warning, you can change to this formula:
FirstN(AddColumns(Filter(myData, Status="Active"), "Annoy", false), 100)
I hope this is helpful for you in your design.