using a portal filter sound like it should work. If you have a field called "paid" you can filter the portal to show only those where yourtable::paid =""
You could also have a portal next to it filtered by yourtable::paid ="X" to show those that have been marked and see a line item move from one the the other as it is marked.
Then to see all just have a layout with a list of all related records to that client.
A portal filter or a relationship based filter could easily exclude records where the status is "paid" for that expense record.
Say you have this relationship:
clients::ClientID = Expenses::ClientID
If you have a number field called "Paid" formatted with a single value check that enters 1 when the box is clicked, you can use this expression to filter out the paid expense records:
Clicking the check box for an expense record will remove it from the portal, but not delete the record the next time the window is refreshed using a script such as:
Refresh Window [Flush cached Join results]
This can be performed with an OnObjectMOdify trigger on the check box field if you want the record to disappear from the portal the instant the box is checked.
It's also possible to set up a portal filter expression that includes a reference to a second field that you'd locate on the layout. That would make it possible to control whether or not "paid" expenses are visible--which would make it easier to correct an error if you click this check box for a given expense record by mistake.