全体を Allow したあとに、制限したいパスに対して Deny を追加すれば
可能。

例えば以下の場合。

https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/ *
→ インターネットに全公開
https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/ *
→ IP アドレス AAA.BBB.CCC.DDD からのアクセスのみ許可

このようなポリシーになる。

{
    "Id": "Policy1234567890",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt0123456789",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::masutaka-hoge/*",
            "Principal": "*"
        },
        {
            "Sid": "Stmt9876543210",
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Deny",
            "Resource": "arn:aws:s3:::masutaka-hoge/bbb/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "AAA.BBB.CCC.DDD"
                }
            },
            "Principal": "*"
        }
    ]
}

S3 の Console の Bucket の Permissions → Bucket Policy で上記ポリ
シーを設定する。

ポリシーはそこから辿れる AWS Policy Generator から作成する。

AWS Policy Generator

結果

インターネットの任意のホストからのアクセス。

$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa

$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>5B876BEDB07E4200</RequestId><HostId>jr8SuXmK87eoccoKG6fuC1KZTjtXRdDF3A13sNv419efcOMGKih0wcBKl+cWj0IzV+jwRQ1xEsA=</HostId></Error>%

IP アドレス AAA.BBB.CCC.DDD からのアクセス

$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/aaa.txt
aaa
aaa
aaa

$ curl https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/bbb.txt
bbb
bbb
bbb

所感

個人的には気持ち悪い運用だと思う。間違えた場合に気づくことが難しく、
監視もやりづらいので、積極的には関わりたくはない。

参考にした記事: S3 IP制限|cloudpack.media